C#-导出.pfx证书并稍后将其导入为文件

韦斯利·卡拉泰(Wesley Kalatai)

我基本上需要将.pfx证书导出Base64string,将其存储在数据库中,以后再从中转换以进行恢复Base64string目前,我正在使用的是X509Certificate2类似以下类:

要将其转换并在数据库中存储cert64字符串:

X509Certificate2 pfx = new X509Certificate2(@"C:\originalcert.pfx", "password", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet);

string cert64 = Convert.ToBase64String(pfx.RawData);

并稍后从数据库中获取它(我需要将其存储为Base64string):

X509Certificate2 cert = new X509Certificate2();
cert.Import(Convert.FromBase64String(string64cert), "password", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.UserKeySet);

File.WriteAllBytes(@"C:\copycert.pfx", cert.Export(X509ContentType.Pfx, "password"));

当我比较C:\originalcert.pfxC:\copycert.pfx使用时,它返回true

X509Certificate2.Equals

对于我正在运行的需要证书才能正常运行的应用程序,有时会因.pfx提供给我的一些不同证书而出错,这些证书用于解决导入/安装到计算机并通过Web浏览器导出它,创建新.pfx文件的问题。和voilà。

使用copycert.pfx文件会给我同样的错误,但是当我尝试copycert.pfx通过文件安装或使用Web浏览器导入文件时,出现:“导入成功”消息,但在“个人”选项卡下找不到已安装的证书,如下所示:如果我安装了原件,我会的originalcert.pfx

另外,从.pfx文件中导出并稍后再导入到.pfx文件中也很重要

我在做什么错/代码导出/导入中丢失了?

地穴32

您的解决方案永远无法以您描述的方式工作。原因如下:

string cert64 = Convert.ToBase64String(pfx.RawData);

此行仅转换证书的公共部分。没有私钥信息存储在RawData属性中。这意味着您无法从该字符串恢复原始PFX。您真正应该做的是读取文件内容并将其转换为Base64字符串,而无需接触X509Certificate2类。将发布的代码的前两行替换为这两行:

Byte[] rawCert = File.ReadAllBytes(@"C:\originalcert.pfx");
String cert64 = Convert.ToBase64String(bytes);

PFX证书仅支持纯二进制编码(即,PFX无法以PEM格式存储),因此只需读取原始字节并将其转换即可。

var cert = new X509Certificate2();
cert.Import(Convert.FromBase64String(string64cert), "password", 
    X509KeyStorageFlags.Exportable | 
    X509KeyStorageFlags.PersistKeySet | 
    X509KeyStorageFlags.UserKeySet);

此命令仅将证书导入到X509Certificate2对象,并将私钥安装到PFX中指定的CSP(如果PFX中未存储任何提供程序信息,则将私钥安装到默认CSP)。要将其安装到个人商店,您需要执行以下操作:

var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadWrite);
store.Certificates.Add(cert);
store.Close();

从.NET 4.6开始,X509Store实现IDisposable,因此您应该使用using子句来布置对象:

using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) {
    store.Open(OpenFlags.ReadWrite);
    store.Add(cert);
}

请注意,只有将证书安装到证书存储区才需要上面的代码。为了将其从数据库还原到PFX文件,只需将二进制数据保存到文件中:

Byte[] rawCert = Convert.FromBase64String(string64cert);
File.WriteAllBytes(@"C:\copycert.pfx");

概要

只是总结所有书面内容。要将PFX转换为Base64字符串:

Byte[] rawCert = File.ReadAllBytes(@"C:\originalcert.pfx");
String cert64 = Convert.ToBase64String(bytes);

从Base64字符串恢复PFX并保存到文件:

Byte[] rawCert = Convert.FromBase64String(string64cert);
File.WriteAllBytes(@"C:\copycert.pfx");

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章