2012-12-08 56 views
0

我一直在试图弄清楚这几天。我已经放弃了。我正尝试从CA的证书和私钥PEM文件创建一个pfx。我能够创建证书和密钥,但现在我无法找出OpenSSL.X509.PKCS12中的最后一个参数。下面是我有:OpenSSL.NET创建PFX

private void btnCreatePFX_Click(object sender, EventArgs e) 
    { 
     string password = "[email protected]"; 
     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.X509.PKCS12.CACertificates,它返回一个OpenSSL.Core.Stack < OpenSSL.X509.X509证书>。另外,当简单阅读一个pfx时,我发现CACertificates是空白的,并且有两个成员Count和IsReadOnly。当我尝试创建该对象时,我不允许设置Count和IsReadOnly,因为它们是只读的。将第四个参数设置为null并且“”也不起作用!我很难过。

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

任何帮助是极大的赞赏。当谈到编程时,我是一个极端的noob,所以对我来说很容易。 :-)

回答

0

您需要一个新的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文件的证书堆栈。该属性为空,因为没有证书添加到堆栈。您可以通过在Stack<X509Certificate>实例上使用.Add(X509Certificate)方法来添加其他证书。

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