Ho un servizio Web ASP.NET che riceve una matrice di byte che rappresenta il contenuto di un file .pfx
contenente un certificato X.509. Il codice lato server utilizza il costruttore System.Security.Cryptography.X509Certificate2
per caricare il certificato dal byte:Perché a volte X509Certificate2 non riesce a creare da un blob?
X509Certificate2 native_cert = new X509Certificate2(
pkcs12_buf /*byte array*/,
password,
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable
);
A seconda di chi il mio processo di servizio è in esecuzione come, questa chiamata sia successo, o non riuscire con un'eccezione "errore interno" . L'ultima chiamata nello stack di eccezioni è a X509Utils._LoadCertFromBlob
, che è il codice non gestito in mscore.dll
.
Questo codice ha esito positivo quando viene eseguito da un'applicazione console in un accesso interattivo utilizzando le credenziali dell'account del servizio. Non funziona quando è in esecuzione con w3wp.exe
in un pool di applicazioni che utilizza le credenziali dell'account del servizio. La modifica dell'identità del pool di applicazioni su un amministratore risolve il problema, quindi deve trattarsi di un problema di privilegi, ma non ho idea di quale privilegio potrebbe essere necessario per questo. Il codice non tocca né il filesystem né gli archivi di certificati di Windows.
[UPDATE: Maggiori informazioni]
Questo errore viene visualizzato nel registro eventi di Windows:
*Cryptographic Parameters:*
**Provider Name:** Microsoft Software Key Storage Provider
**Algorithm Name:** Not Available.
**Key Name:** {E182E13B-166D-472A-A24A-CBEF0808E9ED}
**Key Type:** User key.
*Cryptographic Operation:*
**Operation:** Open Key.
**Return Code:** 0x2
Tutte le idee?
Perché il contesto utente ASP.Net in esecuzione non ha accesso al proprio archivio? (Questo ha risolto il mio problema - era un classico "Ma funziona sulla mia macchina di sviluppo! Solo curioso sul ragionamento.) – DFTR