使用私钥将X509Certificate2导出到字节数组

本文关键字:到字节 数组 X509Certificate2 私钥 | 更新日期: 2023-09-27 18:28:38

我的存储中有一个X509Certificate2证书,我想用私钥将其导出到字节数组。证书字节数组必须这样,当我稍后从字节数组导入证书时,私钥将带有私钥。

我尝试了许多方法,但未能成功导出带有私钥的证书。

X509Store store = new X509Store(StoreLocation.CurrentUser);      
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = store.Certificates[1];
byte[] certBytes = cert.GetRawCertData(); // Obviously does not work!

是否可以成功地将带有私钥的证书导出到字节数组?

非常感谢您的帮助。

使用私钥将X509Certificate2导出到字节数组

X509Certificate2类的Export函数允许导出带有字节数组私钥的证书。

以下代码演示导出带有私钥的证书:

X509Store store = new X509Store(StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert = store.Certificates[1];
// Export the certificate including the private key.
byte[] certBytes = cert.Export(X509ContentType.Pkcs12);

要保护导出的证书,请使用以下Export函数的过载:

byte[] certBytes = cert.Export(X509ContentType.Pkcs12, "SecurePassword");

开始编辑

要导入证书,请使用以下代码:

X509Certificate2 certToImport = new X509Certificate2(arr, "SecurePassword");
// To mark it as exportable use the following constructor:
X509Certificate2 certToImport = new X509Certificate2(arr, "SecurePassword", X509KeyStorageFlags.Exportable);
// certToImport.HasPrivateKey must be true here!!
X509Store store2 = new X509Store(StoreName.TrustedPublisher,
                                 StoreLocation.CurrentUser);
store2.Open(OpenFlags.MaxAllowed);
store2.Add(certToImport);
store2.Close();

结束编辑

没有获得私钥的一个原因可能是,当它最初被添加到CAPI时,它被标记为"不可导出"。在这种情况下,我不相信这是任何真正的方法。