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?
la source
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
qu'un profil utilisateur ne soit pas nécessaire.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.Réponses:
IIS 6 n'a jamais chargé les profils utilisateur. Je suppose que c'est désactivé par défaut pour garder le comportement cohérent et qu'un administrateur doit y adhérer.
Cela est probablement dû au fait que le fournisseur de services cryptographiques Windows tentait de stocker ou de charger une clé pour votre certificat dans le magasin d'utilisateurs et, comme un profil n'était pas disponible, un contexte cryptographique n'était pas disponible. Notez que le
Load User Profile
paramètre s'applique uniquement aux comptes d'utilisateurs. Les comptes de service comme NETWORK SERVICE et ApplicationPoolIdentity ont un traitement spécial.Eh bien, le profil utilisateur est chargé. Cela inclut leur magasin cryptographique, les variables d'environnement telles que% TEMP% et d'autres.
Ce à quoi cela se résume finalement
LoadUserProfile
est appelé par IIS lorsque l'AppPool démarre.Cela peut interrompre la rétrocompatibilité avec une application exécutée sur IIS 6, qui n'a pas chargé le profil utilisateur. Les variables d'environnement sont chargées. Par exemple, lorsque Load User Profile est défini sur true, la variable d'environnement% TEMP% est
C:\Users\AccountName\AppData\Local\Temp
(par exemple). Quand c'est faux, c'estC:\WINDOWS\Temp
.la source
LoadUserProfile=true
dans IIS et de modifier l'emplacement par défaut du dossier temporaire% TEMP%C:\Users\C:\Users\AccountName\AppData\Local\Temp
vers un autre emplacement ? exemple "D: \ AppTempData"