Le Site dans Azure Websites échoue le traitement de X509Certificate2
j'ai un site dans les sites Azure (Service non hébergé) et j'ai besoin de traitement .certificats pfx avec clé privée.
var x509Certificate2 = new X509Certificate2(certificate, password);
mais j'ai été confronté à l'exception suivante:
System.Security.Cryptography.CryptographicException: The system cannot find the file specified.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
à l'article http://blog.tylerdoerksen.com/2013/08/23/pfx-certificate-files-and-windows-azure-websites / j'ai trouvé que cela arrive parce que par défaut le système utilise un répertoire local d'utilisateur pour stocker la clé. Mais Les sites Web Azure n'ont pas de répertoire local de profils d'utilisateurs. Dans le même article, l'auteur propose d'utiliser X509KeyStorageFlags.MachineKeySet
pavillon.
var x509Certificate2 = new X509Certificate2(certificate, password, X509KeyStorageFlags.MachineKeySet);
mais maintenant j'ai une autre exception:
System.Security.Cryptography.CryptographicException: Access denied.
at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
at System.Security.Cryptography.X509Certificates.X509Utils._LoadCertFromBlob(Byte[] rawData, IntPtr password, UInt32 dwFlags, Boolean persistKeySet, SafeCertContextHandle& pCertCtx)
at System.Security.Cryptography.X509Certificates.X509Certificate.LoadCertificateFromBlob(Byte[] rawData, Object password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
at System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(Byte[] rawData, String password, X509KeyStorageFlags keyStorageFlags)
est-ce que quelqu'un peut m'aider à comprendre pourquoi cela arrive et comment le réparer?
5 réponses
je suppose que vous avez trouvé une solution de rechange, mais si d'autres se battent avec cela, j'ai trouvé la réponse à cela dans une autre question SO:
la magie spécifie les drapeaux de stockage X509KeyStorageFlags. Exemple:
var myCertificae = new X509Certificate2(
certificateData,
securePasswordString,
X509KeyStorageFlags.MachineKeySet |
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable);
Azure sites Web a maintenant le soutien natif pour installer des certificats à la boutique de certificats. Avez-vous donné un coup?
détails ici: http://azure.microsoft.com/blog/2014/10/27/using-certificates-in-azure-websites-applications /
Azure sites Web fonctionnent dans un environnement partagé. Je suppose que le constructeur du certificat tente de créer des informations temporaires sur l'instance et qu'il n'a pas la permission de le faire.
Vous devrez peut-être passer à un service hébergé afin de pouvoir exécuter ce travail dans un contexte élevé.
De plus, Avez-vous validé que le mot de passe est correct? Si ce n'est pas exiger un mot de passe, il faut au moins passer chaîne.Vide pour le constructeur. Le fait de passer dans une valeur nulle causerait aussi cette exception.
j'ai eu exactement le même problème, et j'ai lutté de nombreuses heures pour le réparer. Dans l'article que vous mentionnez le dernier appel de pile est à la fonction LoadCertFromFile , mais dans votre (Et mon) cas il est LoadCertFromBlob .
alors J'ai cherché LoadCertFromBlob et j'ai trouvé ceci:
pourquoi X509Certificate2 échoue-t-il parfois à créer à partir d'un blob?
La solution était d'aller dans IIS et de changer l'identité du pool d'applications de " ApplicationPoolIdentity "à" LocalService", de sorte que le certificat est chargé dans le bon dossier local.
dans Azure sites Web / Application Web / Application Mobile - vous devez utiliser le plan de service de L'application qui vous permet d'importer le certificat SSL - afin qu'il ne soit pas gratuit ou partagé. Vous pouvez importer non seulement le certificat SSL, mais aussi pour un exemple de certificat de signature de code et l'utiliser dans signtool ou à partir de PowerShell.
j'ai utilisé cette méthode dans https://vmplace.eu /
si vous essayez d'utiliser un plan libre ou partagé vous recevez l'erreur-ainsi en Azur dans ces Plans, il y a une autre version de .net framework.
vous pouvez vous référer à ce projet aussi: https://github.com/onovotny/SignService