c# - 如何使用 C# 从 PKCS#12 (.p12) 文件获取私钥

标签 c# encryption x509certificate2 pkcs#12

我正在尝试使用 PKCS#12 证书签署一些数据,但是我无法从 PKCS#12 (.p12) 文件获取私钥。

    public byte[] sign(string text)
    {
        string password = "1111";
        X509Certificate2 cert = new X509Certificate2("c:\\certificate.p12",password);
        byte[] certData = cert.Export(X509ContentType.Pfx,password);

        X509Certificate2 newCert = new X509Certificate2(certData, password);
        RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)newCert.PrivateKey;

        SHA1Managed sha1 = new SHA1Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);
        return crypt.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    }

问题是 newCert.PrivateKey 为空,但如果我以类似的方式使用 .pfx certicitae,它会起作用。

    public byte[] sign(string text)
    {
        string password = "1234";
        X509Certificate2 cert = new X509Certificate2("c:\\certificate.pfx", password);
        RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)cert.PrivateKey;
        SHA1Managed sha1 = new SHA1Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = encoding.GetBytes(text);
        byte[] hash = sha1.ComputeHash(data);
        return crypt.SignHash(hash, CryptoConfig.MapNameToOID("SHA1"));
    }

所以问题是如何从 .p12 文件中获取私钥?

最佳答案

我发布了一个类似的问题 here ,虽然对你来说不是一回事,但问题也可能是权限。
我的建议是,首先,您必须确保(我想您已经做到了)私钥是可导出的并且您有权访问该文件。
接下来,尝试将内容类型导出为 X509ContentType.Pkcs12 而不是 X509ContentType.Pfx
最后,如果可能的话,为什么不尝试将它导入到 certstore。我相信这样更安全。这些步骤在上面的链接中。

关于c# - 如何使用 C# 从 PKCS#12 (.p12) 文件获取私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5471716/

相关文章:

mysql - 无法在 RDS 实例上启用加密

c++ - 加密初始化 vector

c# - 在 C# 和 iText 7 中使用 x509Certificate2 创建 IExternalSignature

c# - 尝试创建非自签名证书时出现异常

c# - 在 C# 上登录用户后注销

c# - 在n层c#层中设置连接

encryption - 使用 Amazon KMS 加密/解密小型应用程序数据的缺点

.net - 如果使用 ChainPolicy RevitationMode Online,X590Certificate.Build 是否使用 OCSP?

C# - Foreach 循环与 if 语句

c# - 我只能关闭一次窗体,在创建窗口句柄之前无法在控件上调用 InvalidOperation Exception Invoke 或 BeginInvoke