Was genau passiert, wenn ich LoadUserProfile des IIS-Pools einstelle?

103

Ich stand vor dem folgenden Problem.

Ich führe den folgenden Code aus

var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);

in zwei Prozessen. Einer der Prozesse läuft unter LOCAL_SYSTEMund dort ist dieser Code erfolgreich. Ein anderes wird in IIS unter einem lokalen Benutzerkonto ausgeführt, das zur lokalen Gruppe "Benutzer" gehört, und dort wird die folgende Ausnahme angezeigt:

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

Also habe ich ein bisschen gegoogelt und diese Antwort auf eine ähnliche Frage gefunden. Ich habe versucht, LoadUserProfileden Anwendungspool zu aktivieren , und er funktioniert jetzt.

Das Problem ist, dass ich nicht verstehe, was genau passiert, wenn ich einstelle LoadUserProfileund welche Konsequenzen dies haben könnte. Ich meine, wenn es eine "gute" Sache ist, warum ist es dann nicht standardmäßig "an" und warum ist es schließlich da?

Was genau passiert, wenn ich mich LoadUserProfileim IIS-Pool einstelle und welche negativen Konsequenzen kann dies haben?

scharfer Zahn
quelle
6
Nur ein nachträglicher Gedanke: Wenn das Laden des Benutzerprofils für Sie ein Problem darstellt, können Sie das Laden des Zertifikats new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)so ändern, dass kein Benutzerprofil erforderlich ist.
vcsjones
1
Wenn Sie als ApplicationPoolIdentity ausgeführt werden, möchten Sie verwenden, new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)wodurch das Schreiben des privaten Schlüssels in den Speicher vermieden wird und keine Administratorrechte auf dem Server erforderlich sind.
Nate

Antworten:

116

Ich meine, wenn es eine "gute" Sache ist, warum ist es dann nicht standardmäßig "an" und warum ist es schließlich da?

IIS 6 hat niemals Benutzerprofile geladen. Ich würde annehmen, dass dies standardmäßig deaktiviert ist, um das Verhalten konsistent zu halten, und ein Administrator muss sich dafür anmelden.

Ich habe versucht, LoadUserProfile für den Anwendungspool zu aktivieren, und es funktioniert jetzt.

Dies ist höchstwahrscheinlich darauf zurückzuführen, dass der Windows-Kryptografiedienstanbieter versucht hat, einen Schlüssel für Ihr Zertifikat im Benutzerspeicher zu speichern oder zu laden. Da ein Profil nicht verfügbar war, war kein kryptografischer Kontext verfügbar. Beachten Sie, dass die Load User ProfileEinstellung nur für Benutzerkonten gilt. Dienstkonten wie NETWORK SERVICE und ApplicationPoolIdentity werden speziell behandelt.

Was genau passiert, wenn ich LoadUserProfile im IIS-Pool einstelle?

Nun, das Benutzerprofil ist geladen. Dies umfasst den kryptografischen Speicher, Umgebungsvariablen wie% TEMP% und andere.

Worauf es letztendlich LoadUserProfilehinausläuft, wird von IIS aufgerufen, wenn der AppPool gestartet wird.

Welche negativen Folgen kann es haben?

Möglicherweise wird die Abwärtskompatibilität mit einer App unterbrochen, die unter IIS 6 ausgeführt wurde und das Benutzerprofil nicht geladen hat. Die Umgebungsvariablen werden geladen. Wenn beispielsweise Benutzerprofil laden auf true gesetzt ist, lautet die Umgebungsvariable% TEMP% C:\Users\AccountName\AppData\Local\Temp(zum Beispiel). Wenn falsch, ist es C:\WINDOWS\Temp.

vcsjones
quelle
1
+1 Für NETWORK SERVICE als App-Pool-Identität, aber ApplicationPoolIdentity war für mich nicht erfolgreich.
David d C e Freitas
3
"Möglicherweise wird die Abwärtskompatibilität mit einer App unterbrochen, die unter IIS 6 ausgeführt wurde und das Benutzerprofil nicht geladen hat." Ich würde vermuten, dass dies auch Auswirkungen auf die Leistung (das Profil muss tatsächlich geladen werden; dies bedeutet beispielsweise das Laden der HKCU-Registrierungsstruktur) und auf die Sicherheit (größerer potenzieller Vektor) hat.
Sören Kuklau
1
Ist es möglich, LoadUserProfile=truein IIS den Standardspeicherort des temporären Ordners% TEMP% von C:\Users\C:\Users\AccountName\AppData\Local\Tempeinem anderen zu ändern ? Beispiel "D: \ AppTempData"
Murali Murugesan
Murali Murugesan - haben Sie jemals eine Antwort auf diese Frage bekommen? Ich habe das gleiche Problem. Ich möchte, dass das Standard-Temp-Verzeichnis geändert wird.
VBAHole
1
Ich bin vor Jahren auf die Erstellung eines Back-End-Dienstes gestoßen, der einen Remote-Webdienst aufgerufen hat, der durch die X509-Clientzertifikatauthentifizierung geschützt ist. Da persönliche Zertifikate im Profil eines Benutzers gespeichert sind, musste ich mich bei der Installation des Dienstes als Anmeldekonto des Dienstes beim Zielserver anmelden, wodurch ein Benutzerprofil erstellt wird, und dann das Clientzertifikat im Zertifikatspeicher des Anmeldekontos installieren. Danach wird das Client-Zertifikat zur Laufzeit geladen.
Craig Boland