【问题标题】:Why does X509Certificate2 sometimes fail to create from a blob?为什么 X509Certificate2 有时无法从 blob 创建?
【发布时间】:2010-10-08 04:32:45
【问题描述】:

我有一个 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  

有什么想法吗?

【问题讨论】:

    标签: c# blob x509certificate2


    【解决方案1】:

    我自己刚刚找到了解决方案:

    X509KeyStorageFlags flags = X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet;
    
    X509Certificate2 cert = new X509Certificate2(pkcs12_buf, password, flags);
    

    这里的技巧是使用本地密钥库MachineKeySet 标志而不是用户配置文件密钥库,如果您不指定替代位置,这是默认设置。因为 ASP.NET 进程标识不加载用户配置文件存储,所以在以编程方式导入证书时无法访问存储,但可以访问机器存储。

    我认为PersistKeySet 只是保持加载私钥,但我不确定它究竟做了什么 - 如果您出于某种原因需要访问私钥,它是必需的。

    【讨论】:

    • 为什么你运行的 ASP.Net 用户上下文不能访问它自己的存储? (这确实解决了我的问题 - 这是一个经典的“但它适用于我的开发机器!只是对推理感到好奇。)
    【解决方案2】:

    尝试授予 ASP.NET 帐户对以下文件夹的权限:C:\Documents And Settings\All Users\Microsoft\Crypto\RSA\MachineKeys\(可能因您的环境而异)

    【讨论】:

    • 我认为你在正确的轨道上,但它似乎并没有试图访问文件系统。成功的帐户在用户的个人配置文件(不是 AllUsers)下访问 Microsoft\Crypto\RSA。根据 procmon 的说法,失败的甚至是没有尝试访问文件系统。
    • 此权限更改在 Win2k8 上对我有用。节省了我大量的调试时间。谢谢!
    猜你喜欢
    • 2014-07-07
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2022-07-17
    • 2021-04-03
    • 1970-01-01
    相关资源
    最近更新 更多