gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:57:11 28 4
gpt4 key购买 nike

我基本上需要将 .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);

稍后从数据库中获取(我需要将其存储为 Base64 字符串):

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 证书的错误,我使用这些证书来解决导入/安装到机器并通过网络浏览器将其导出,创建一个新的 .pfx 文件,瞧瞧。

使用 copycert.pfx 文件给我同样的错误,但是当我尝试通过文件安装 copycert.pfx 或使用网络浏览器导入它时,我得到: “导入成功”消息,但在“个人”选项卡下找不到已安装的证书,就像我安装原始 originalcert.pfx 时一样。

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

我在代码导出/导入中做错了什么/遗漏了什么?

最佳答案

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

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

此行仅转换证书的公共(public) 部分。没有私钥信息存储在 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");

关于C# - 导出 .pfx 证书并稍后将其作为文件导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41726614/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com