OpenSSL.NET创建PFX

时间:2012-12-08 03:45:43

标签: c# openssl

我一直在努力解决这个问题。我已经放弃了。我正在尝试从CA的证书和私钥PEM文件创建一个pfx。我能够创建证书和密钥,但现在我无法弄清楚OpenSSL.X509.PKCS12中的最后一个参数。这就是我所拥有的:

    private void btnCreatePFX_Click(object sender, EventArgs e)
    {
        string password = "p@ssw0rd";
        string key_path = @"certs\ca_key.key";
        string cert_path = @"certs\ca_cert.crt";
        string k = File.ReadAllText(key_path);
        string c = File.ReadAllText(cert_path);

        OpenSSL.Core.BIO key_bio = new OpenSSL.Core.BIO(k);
        OpenSSL.Core.BIO cert_bio = new OpenSSL.Core.BIO(c);

        OpenSSL.Crypto.CryptoKey key = OpenSSL.Crypto.CryptoKey.FromPrivateKey(k, "");
        OpenSSL.X509.X509Certificate cert = new OpenSSL.X509.X509Certificate(cert_bio);
        //OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate> hmm = new OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate>();

        var pfx = new OpenSSL.X509.PKCS12(password, key, cert, null); // <-- Problem with 4th parameter (I think)
    }

我知道第4个参数需要是OpenSSL.Core.Stack&lt; OpenSSL.X509.X509Certificate&gt;但我无法弄清楚如何设置它。源代码中的测试读取pfx,然后使用相同pfx对象的属性创建新的pfx对象。因此,他们很容易获得访问者OpenSSL.X509.PKCS12.CACertificates,它返回一个OpenSSL.Core.Stack&lt; OpenSSL.X509.X509Certificate&gt;。此外,当简单地读取pfx时,我看到CACertificates是空白的,并且有两个成员,Count和IsReadOnly。当我尝试创建该对象时,我不允许设置Count和IsReadOnly,因为它们是只读的。将第4个参数设置为null和“”也不起作用!我很难过。

示例如下:https://github.com/flaub/openssl-net/tree/master/test

非常感谢任何帮助。在编程时我是一个极端的菜鸟,所以对我来说很容易。 : - )

1 个答案:

答案 0 :(得分:0)

您需要OpenSSL.Core.Stack<OpenSSL.X509Certificate>的新实例。在您的示例中,您已经拥有其中一个:

//OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate> hmm = new OpenSSL.Core.Stack<OpenSSL.X509.X509Certificate>();

因此,您应该能够通过取消注释该行并将hmm作为第4个参数传递来创建PKCS12实例。

Stack<X509Certificate>参数用于将多个证书(和密钥)包含到单个文件中。您通常只包含属于验证链的证书,例如您在X509Certificate cert参数中指定的证书的任何中间证书或CA证书。

PKCS12实例上的CACertificates属性是已添加到pfx文件的证书堆栈。该属性为空,因为没有向堆栈添加证书。您可以使用.Add(X509Certificate)实例上的Stack<X509Certificate>方法添加其他证书。

在超出范围之前,您需要在Dispose()实例上调用Stack<X509Certificate>(或将其包装在using(...)块中)。