Cosa succede esattamente quando imposto LoadUserProfile del pool IIS?


103

Ho affrontato il seguente problema.

Eseguo il codice seguente

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

in due processi. Uno dei processi viene eseguito LOCAL_SYSTEMe lì questo codice riesce. Un altro viene eseguito all'interno di IIS con un account utente locale appartenente al gruppo locale "Users" e lì ottengo la seguente eccezione:

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

Quindi ho cercato un po 'su Google e ho trovato questa risposta a una specie di domanda simile. Ho provato ad abilitare LoadUserProfileil pool di applicazioni e ora funziona.

Il problema è che non capisco cosa succede esattamente quando ho impostato LoadUserProfilee quali conseguenze potrebbe avere. Voglio dire, se è una cosa "buona", allora perché non è "attiva" per impostazione predefinita e perché è lì dopo tutto?

Cosa succede esattamente quando eseguo l'impostazione LoadUserProfilenel pool IIS e quali conseguenze negative può avere?


6
Solo un ripensamento, se il caricamento del profilo utente è un problema per te, puoi modificare il caricamento del certificato in new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)modo che non sia necessario un profilo utente.
vcsjones

1
Se si esegue come ApplicationPoolIdentity, si vorrà utilizzare new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)che evita di scrivere la chiave privata nell'archivio e non richiede privilegi amministrativi sul server.
Nate

Risposte:


117

Voglio dire, se è una cosa "buona", allora perché non è "attiva" per impostazione predefinita e perché è lì dopo tutto?

IIS 6 non ha mai caricato i profili utente. Presumo che questo sia disattivato per impostazione predefinita per mantenere il comportamento coerente e un amministratore deve accettarlo.

Ho provato ad abilitare LoadUserProfile per il pool di applicazioni e ora funziona.

Ciò è molto probabile perché il provider di servizi di crittografia di Windows stava tentando di archiviare o caricare una chiave per il certificato nell'archivio utenti e poiché un profilo non era disponibile, un contesto crittografico non era disponibile. Tieni presente che l' Load User Profileimpostazione si applica solo agli account utente. Gli account di servizio come NETWORK SERVICE e ApplicationPoolIdentity hanno una gestione speciale.

Cosa succede esattamente quando imposto LoadUserProfile nel pool IIS

Bene, il profilo utente viene caricato. Ciò include il loro archivio crittografico, variabili di ambiente come% TEMP% e altre.

Ciò che alla fine si riduce a LoadUserProfileè chiamato da IIS all'avvio di AppPool.

quali conseguenze negative può avere?

Potrebbe interrompere la compatibilità con le versioni precedenti di un'app eseguita su IIS 6, che non ha caricato il profilo utente. Le variabili d'ambiente vengono caricate. Ad esempio, quando Load User Profile è true, la variabile di ambiente% TEMP% è C:\Users\AccountName\AppData\Local\Temp(ad esempio). Quando è falso, lo è C:\WINDOWS\Temp.


1
+1 per NETWORK SERVICE come identità del pool di app, ma ApplicationPoolIdentity non ha avuto successo per me.
David d C e Freitas

3
"Potrebbe interrompere la compatibilità con le versioni precedenti di un'app eseguita su IIS 6, che non ha caricato il profilo utente." Immagino che abbia anche implicazioni sulle prestazioni (il profilo deve essere effettivamente caricato; questo significa, ad esempio, caricare l'hive del registro HKCU) e sulla sicurezza (vettore potenziale più grande).
Sören Kuklau

1
È possibile impostare LoadUserProfile=truein IIS e modificare la posizione della cartella temporanea predefinita% TEMP% da C:\Users\C:\Users\AccountName\AppData\Local\Tempqualche altra parte? esempio "D: \ AppTempData"
Murali Murugesan

Murali Murugesan - hai mai avuto una risposta a questa domanda? Ho lo stesso problema. Voglio che la directory Temp predefinita sia cambiata.
VBAHole

1
Mi sono imbattuto anni fa nella creazione di un servizio di back-end che chiamava un servizio Web remoto protetto dall'autenticazione del certificato client X509. Poiché i certificati personali sono archiviati nel profilo di un utente, durante l'installazione del servizio, ho dovuto accedere al server di destinazione come account di accesso del servizio, che crea un profilo utente, quindi installare il certificato client nell'archivio certificati dell'account di accesso. Successivamente, il certificato client verrà caricato in fase di esecuzione.
Craig Boland
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.