2012-12-08 57 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(...)塊中),然後超出範圍。