- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我基本上需要将 .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.pfx
和 C:\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/
我正在编写一个插件,有一个ajax调用向用户显示数据。 如果用户想在ajax成功时添加一些js?他可以从他的 js 脚本中做到这一点吗,比如定位这个 ajax 成功事件。 例如: $(documen
我有 html 代码,例如 - x 最初插入 div 'insert_calendar_eda_form'。 Javascript代码 calendar_eda_add
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
我已经使用命令 sudo start myservice 启动了一个 upstart 服务。我想要一种方法,以便稍后我(或任何人)可以检查该服务是否已启动并正在运行。检查它的命令是什么? 最佳答案 找
我是一名优秀的程序员,十分优秀!