我有一个ASP.NET Web服务,它接收一个字节数组,该数组代表包含X.509证书的.pfx
文件的内容。 服务器端代码使用System.Security.Cryptography.X509Certificate2
构造函数从字节数组中加载证书:
X509Certificate2 native_cert = new X509Certificate2(
pkcs12_buf /*byte array*/,
password,
X509KeyStorageFlags.PersistKeySet |
X509KeyStorageFlags.Exportable
);
根据我的服务进程运行的身份不同,这个调用要么成功,要么失败并出现“内部错误”异常。异常堆栈中的最后一个调用是X509Utils._LoadCertFromBlob
,它是在mscore.dll
中的非托管代码。
当在使用服务帐户凭据的交互式登录下的控制台应用程序中运行此代码时,它会成功。但在使用服务帐户凭据的应用程序池下的w3wp.exe
中运行时,则会失败。将应用程序池标识更改为管理员可解决该问题,因此这必须是特权问题,但我不知道需要哪些特权。该代码未触及文件系统或Windows证书存储区。
[更新:更多信息]
此错误出现在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
有什么想法吗?