我基本上需要将.pfx
证书导出为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.pfx
和C:\copycert.pfx
时,它会返回true
X509Certificate2.Equals
对于我正在运行的应用程序需要证书才能正常工作,我有时会收到一些错误,提供给我的一些不同的.pfx
证书,我用它来处理/安装到机器并导出它通过网络浏览器,创建一个新的.pfx
文件并发送电子邮件。
使用copycert.pfx
文件给出了同样的错误但是当我尝试通过文件安装copycert.pfx
或使用Web浏览器导入它时,我得到:“导入成功”消息,但是如果我安装了原始originalcert.pfx
,我会在“个人”标签下找到已安装的证书。
此外,我必须从.pfx
文件导出并稍后将其导入.pfx
文件。
我在做错了什么/在代码导出/导入中丢失了什么?
答案 0 :(得分:7)
您的解决方案无法以您描述的方式运作。原因如下:
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");