Co dokładnie się dzieje, gdy ustawię LoadUserProfile puli usług IIS?

103

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_SYSTEMi 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ć LoadUserProfiledla puli aplikacji i teraz działa.

Problem polega na tym, że nie rozumiem, co dokładnie się dzieje, kiedy ustawiam LoadUserProfilei 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ę LoadUserProfilew puli usług IIS i jakie negatywne konsekwencje może to mieć?

ostry
źródło
6
Dopiero po namyśle, jeśli załadowanie profilu użytkownika jest dla Ciebie problemem, możesz zmienić ładowanie certyfikatu na new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)tak, aby profil użytkownika nie był potrzebny.
vcsjones
1
Jeśli działasz jako ApplicationPoolIdentity, będziesz chciał użyć, new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)który pozwala uniknąć zapisywania klucza prywatnego w magazynie i nie wymaga uprawnień administracyjnych na serwerze.
Nate,

Odpowiedzi:

117

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?

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ć.

Próbowałem włączyć LoadUserProfile dla puli aplikacji i teraz działa.

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 Profileustawienie dotyczy tylko kont użytkowników. Konta usług, takie jak NETWORK SERVICE i ApplicationPoolIdentity, mają specjalną obsługę.

Co dokładnie się stanie, gdy ustawię LoadUserProfile w puli usług IIS

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ę, LoadUserProfilejest wywoływane przez IIS podczas uruchamiania AppPool.

jakie może to mieć negatywne konsekwencje?

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

vcsjones
źródło
1
+1 dla usługi NETWORK jako tożsamości puli aplikacji, ale ApplicationPoolIdentity nie powiodło się.
David d C e Freitas
3
„Może zepsuć wsteczną zgodność z aplikacją działającą w usługach IIS 6, która nie załadowała profilu użytkownika”. Wydaje mi się, że ma to również wpływ na wydajność (profil musi być faktycznie załadowany; oznacza to na przykład załadowanie gałęzi rejestru HKCU) i bezpieczeństwo (większy potencjalny wektor).
Sören Kuklau
1
Czy można ustawić LoadUserProfile=truew usługach IIS i zmienić domyślną lokalizację folderu tymczasowego% TEMP% z C:\Users\C:\Users\AccountName\AppData\Local\Tempdo innego miejsca? przykład „D: \ AppTempData”
Murali Murugesan
Murali Murugesan - czy kiedykolwiek dostałeś odpowiedź na to pytanie? Mam ten sam problem. Chcę zmienić domyślny katalog Temp.
VBAHole
1
Wpadłem na to lata temu, budując usługę zaplecza, która wywoływała zdalną usługę sieciową chronioną przez uwierzytelnianie certyfikatu klienta X509. Ponieważ certyfikaty osobiste są przechowywane w profilu użytkownika, podczas instalowania usługi musiałem zalogować się do serwera docelowego jako konto logowania usługi, które tworzy profil użytkownika, a następnie zainstalować certyfikat klienta w magazynie certyfikatów konta logowania. Następnie certyfikat klienta zostanie załadowany w czasie wykonywania.
Craig Boland