Que se passe-t-il exactement lorsque je définis LoadUserProfile du pool IIS?

103

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_SYSTEMet 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 LoadUserProfilele 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 LoadUserProfileet 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 LoadUserProfiledans le pool IIS et quelles conséquences négatives peut-il avoir?

dents acérées
la source
6
Juste après coup, si le chargement du profil utilisateur est un problème pour vous, vous pouvez modifier votre chargement du certificat pour new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)qu'un profil utilisateur ne soit pas nécessaire.
vcsjones
1
Si vous utilisez ApplicationPoolIdentity, vous souhaiterez utiliser 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.
Nate le

Réponses:

117

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?

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.

J'ai essayé d'activer LoadUserProfile pour le pool d'applications et cela fonctionne maintenant.

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 Profileparamètre s'applique uniquement aux comptes d'utilisateurs. Les comptes de service comme NETWORK SERVICE et ApplicationPoolIdentity ont un traitement spécial.

Que se passe-t-il exactement lorsque je définis LoadUserProfile dans le pool IIS

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 LoadUserProfileest appelé par IIS lorsque l'AppPool démarre.

quelles conséquences négatives cela peut-il avoir?

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'est C:\WINDOWS\Temp.

vcsjones
la source
1
+1 Pour le SERVICE RÉSEAU en tant qu'identité du pool d'applications, mais ApplicationPoolIdentity n'a pas réussi pour moi.
David d C e Freitas
3
"Cela peut interrompre la rétrocompatibilité avec une application exécutée sur IIS 6, qui n'a pas chargé le profil utilisateur." Je suppose qu'il a également des implications en termes de performances (le profil doit être chargé; cela signifie, par exemple, le chargement de la ruche de registre HKCU) et de sécurité (vecteur potentiel plus grand).
Sören Kuklau
1
Est-il possible de définir LoadUserProfile=truedans IIS et de modifier l'emplacement par défaut du dossier temporaire% TEMP% C:\Users\C:\Users\AccountName\AppData\Local\Tempvers un autre emplacement ? exemple "D: \ AppTempData"
Murali Murugesan
Murali Murugesan - avez-vous déjà obtenu une réponse à cette question? J'ai le même problème. Je veux que le répertoire Temp par défaut soit changé.
VBAHole
1
J'ai rencontré il y a des années la création d'un service back-end qui appelait un service Web distant protégé par l'authentification par certificat client X509. Étant donné que les certificats personnels sont stockés dans le profil d'un utilisateur, lors de l'installation du service, j'ai dû me connecter au serveur cible en tant que compte de connexion du service, ce qui crée un profil utilisateur, puis installer le certificat client dans le magasin de certificats du compte de connexion. Après cela, le certificat client se chargerait au moment de l'exécution.
Craig Boland