2017-06-09 96 views
1

是否有任何方法將證書和密鑰(都作爲Base64字符串從服務中單獨接收)合併到使用C#/ .NET標準以編程方式?使用工具不是一種選擇,因爲我需要自動化它。.NET標準 - 以編程方式將證書和私鑰合併到.pfx文件

上下文:我需要將一個證書和一個私鑰(不包含頁眉和頁腳的單獨的Base64字符串)加載到一個X509Certificate2對象中,以便將它從.NET Standard 1.6庫傳遞到應用程序。 問題是,.NET Standard中的X509Certificate2類中沒有PrivateKey屬性!所以對我來說,將私鑰真正加載到X509Certificate2對象中的唯一方法是將其與證書本身結合在.pfx文件中,並像構造函數中那樣加載它。

回答

4

沒有辦法用框架類型來做到這一點。 BouncyCastle或其他庫可能是可能的。

.NET核2.0已經加入到合併經由擴展方法證書和密鑰一起對象(到一個新的X509Certificate2對象)的能力:

X509Certificate2 mergedCert = cert.CopyWithPrivateKey(rsaPrivateKey); 
X509Certificate2 mergedCert = cert.CopyWithPrivateKey(dsaPrivateKey); 
X509Certificate2 mergedCert = cert.CopyWithPrivateKey(ecdsaPrivateKey); 

但這需要專門爲netcoreapp20(未netstandard20)編譯。

框架類型也沒有加載關鍵對象從二進制表示的方式(與CngKey.Import例外,但僅適用於Windows),只能從預解析結構(RSAParametersDSAParametersECParameters) 。

在Linux上完成此目標的最簡單方法是使用System.Process產生類似於openssl pkcs12 -export -out tmp.pfx -in tmp.cer -inkey tmp.key -password pass:""的調用(如果BouncyCastle無法幫到你)。

在Windows上,你也許可以使用CngKey.Import和P/Invoke的CertSetCertificateContextProperty(用於CERT_NCRYPT_KEY_HANDLE_PROP_ID(78))到隨後致電突變證書cert.Export

+0

PFX/PKCS#12不僅僅是連接證書和密鑰。 – jww

+0

@jww是真的,但是'cert.Export'(給PFX)一旦你可以得到密鑰關聯就可以處理它 – bartonjs

+0

@bartonjs你能提供一個如何用BouncyCastle做的例子嗎? – Maxim

相關問題