J'ai fait face au problème suivant.
Je lance le code suivant
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
en deux processus. Un des processus s'exécute sous LOCAL_SYSTEM
et là ce code réussit. Un autre fonctionne dans IIS sous un compte d'utilisateur local appartenant au groupe local "Users" et là j'obtiens l'exception suivante:
System.Security.Cryptography.CryptographicException
Object was not found.
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.X509Certificate2..ctor(Byte[] rawData, String password)
//my code here
J'ai donc cherché un peu sur Google et trouvé cette réponse à une sorte de question similaire. J'ai essayé d'activer LoadUserProfile
le pool d'applications et cela fonctionne maintenant.
Le problème est que je ne comprends pas ce qui se passe exactement lorsque je me fixe LoadUserProfile
et quelles conséquences cela pourrait avoir. Je veux dire si c'est une "bonne" chose alors pourquoi ce n'est pas "activé" par défaut et pourquoi est-il là après tout?
Que se passe-t-il exactement lorsque je définis LoadUserProfile
dans le pool IIS et quelles conséquences négatives peut-il avoir?
new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
ce qui évite d'écrire la clé privée dans le magasin et ne nécessitera pas de privilèges administratifs sur le serveur.
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
qu'un profil utilisateur ne soit pas nécessaire.