Zmierzyłem się z następującym problemem.
Uruchamiam następujący kod
var binaryData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(binaryData, password);
w dwóch procesach. Jeden z procesów działa pod nim LOCAL_SYSTEM
i tam ten kod kończy się sukcesem. Kolejny działa w usługach IIS na lokalnym koncie użytkownika należącym do grupy lokalnej „Użytkownicy” i pojawia się następujący wyjątek:
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
Poszukałem więc trochę w Google i znalazłem odpowiedź na podobne pytanie. Próbowałem włączyć LoadUserProfile
dla puli aplikacji i teraz działa.
Problem polega na tym, że nie rozumiem, co dokładnie się dzieje, kiedy ustawiam LoadUserProfile
i jakie mogą to mieć konsekwencje. Chodzi mi o to, że jeśli jest to „dobra” rzecz, to dlaczego nie jest domyślnie włączona i dlaczego w końcu tak jest?
Co dokładnie się dzieje, gdy ustawię LoadUserProfile
w puli usług IIS i jakie negatywne konsekwencje może to mieć?
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
tak, aby profil użytkownika nie był potrzebny.new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
który pozwala uniknąć zapisywania klucza prywatnego w magazynie i nie wymaga uprawnień administracyjnych na serwerze.Odpowiedzi:
IIS 6 nigdy nie załadowano profili użytkowników. Zakładam, że jest to domyślnie wyłączone, aby zachować spójność zachowania, a administrator musi się na to zgodzić.
Jest to najprawdopodobniej spowodowane tym, że dostawca usług kryptograficznych systemu Windows próbował zapisać lub załadować klucz dla Twojego certyfikatu w magazynie użytkowników, a ponieważ profil nie był dostępny, kontekst kryptograficzny nie był dostępny. Pamiętaj, że to
Load User Profile
ustawienie dotyczy tylko kont użytkowników. Konta usług, takie jak NETWORK SERVICE i ApplicationPoolIdentity, mają specjalną obsługę.Cóż, profil użytkownika jest załadowany. Obejmuje to ich magazyn kryptograficzny, zmienne środowiskowe, takie jak% TEMP%, i inne.
To, do czego ostatecznie sprowadza się,
LoadUserProfile
jest wywoływane przez IIS podczas uruchamiania AppPool.Może to zepsuć wsteczną zgodność z aplikacją działającą w usługach IIS 6, która nie załadowała profilu użytkownika. Zmienne środowiskowe są ładowane. Na przykład, jeśli Załaduj profil użytkownika ma wartość prawda, zmienną środowiskową% TEMP% jest
C:\Users\AccountName\AppData\Local\Temp
(na przykład). Kiedy jest fałszywe, to jestC:\WINDOWS\Temp
.źródło
LoadUserProfile=true
w usługach IIS i zmienić domyślną lokalizację folderu tymczasowego% TEMP% zC:\Users\C:\Users\AccountName\AppData\Local\Temp
do innego miejsca? przykład „D: \ AppTempData”