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_SYSTEM
e 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 LoadUserProfile
il pool di applicazioni e ora funziona.
Il problema è che non capisco cosa succede esattamente quando ho impostato LoadUserProfile
e 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 LoadUserProfile
nel pool IIS e quali conseguenze negative può avere?
new X509Certificate2(keyFilePath, keyFilePassword, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.EphemeralKeySet)
che evita di scrivere la chiave privata nell'archivio e non richiede privilegi amministrativi sul server.
new X509Certificate2(binaryData, password, X509KeyStorageFlags.MachineKeySet)
modo che non sia necessario un profilo utente.