1

这几天我一直在想办法解决这个问题。我已经放弃了。我正在尝试从 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)
    }

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

示例在这里:https ://github.com/flaub/openssl-net/tree/master/test

任何帮助是极大的赞赏。在编程方面,我是一个极端的菜鸟,所以请放轻松。:-)

4

1 回答 1

1

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

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

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

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

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

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

于 2012-12-13T06:38:28.640 回答