当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《C#-导出.pfx证书并稍后将其作为文件导入》经验,为你挑选了1个好方法。

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

要转换它并在DB中存储cert64字符串:

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

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

稍后从DB获取它(我需要将其存储为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文件瞧.

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

此外,重要的是我从.pfx文件导出并稍后将其导入.pfx文件.

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



1> Crypt32..:

您的解决方案永远不会以您描述的方式工作.原因如下:

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");

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有