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(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
który pozwala uniknąć zapisywania klucza prywatnego w magazynie i nie wymaga uprawnień administracyjnych na serwerze.
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
tak, aby profil użytkownika nie był potrzebny.