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_SYSTEM
und 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, LoadUserProfile
den Anwendungspool zu aktivieren , und er funktioniert jetzt.
Das Problem ist, dass ich nicht verstehe, was genau passiert, wenn ich einstelle LoadUserProfile
und 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 LoadUserProfile
im IIS-Pool einstelle und welche negativen Konsequenzen kann dies haben?
quelle
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
so ändern, dass kein Benutzerprofil erforderlich ist.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.Antworten:
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.
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 Profile
Einstellung nur für Benutzerkonten gilt. Dienstkonten wie NETWORK SERVICE und ApplicationPoolIdentity werden speziell behandelt.Nun, das Benutzerprofil ist geladen. Dies umfasst den kryptografischen Speicher, Umgebungsvariablen wie% TEMP% und andere.
Worauf es letztendlich
LoadUserProfile
hinausläuft, wird von IIS aufgerufen, wenn der AppPool gestartet wird.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 esC:\WINDOWS\Temp
.quelle
LoadUserProfile=true
in IIS den Standardspeicherort des temporären Ordners% TEMP% vonC:\Users\C:\Users\AccountName\AppData\Local\Temp
einem anderen zu ändern ? Beispiel "D: \ AppTempData"