У меня есть веб-служба ASP.NET, которая принимает байтовый массив, представляющий содержимое файла .pfx
, содержащего сертификат X.509. Код на стороне сервера использует System.Security.Cryptography.X509Certificate2
конструктор для загрузки сертификата с байтами:Почему X509Certificate2 иногда не удается создать из блоба?
X509Certificate2 native_cert = new X509Certificate2(
pkcs12_buf /*byte array*/,
password,
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable
);
В зависимости от того, кто мой процесс службы работает как этот вызов будет либо успех, либо не с исключением «внутренняя ошибка» , Последний вызов стека исключений - X509Utils._LoadCertFromBlob
, который является неуправляемым кодом в mscore.dll
.
Этот код преуспевает при запуске из консольного приложения в интерактивном режиме входа с использованием учетных данных учетной записи службы. Он не работает при запуске под w3wp.exe
в пуле приложений, который использует учетные данные учетной записи службы. Изменение идентификатора пула приложений для администратора устраняет проблему, поэтому проблема должна быть привилегией, но я понятия не имею, какая привилегия может быть необходима для этого. Код не касается ни файловой системы, ни хранилищ сертификатов Windows.
[UPDATE: Подробнее]
Эта ошибка появляется в журнале событий 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
Любые идеи?
Почему пользовательский контекст ASP.Net, который вы запускаете, не имеет доступа к своему собственному магазину? (Это решило мою проблему - это был классический «Но это работает на моей машине-разработчике! Просто любопытно рассуждать»). – DFTR