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

C# - Export .pfx certificate and import it later as a file

我基本上需要将 .pfx 证书导出为 Base64string,将其存储在数据库中并稍后恢复,从 Base64string 转换。 我现在使用的是 X509Certificate2 class 如下所示:

转换它并在数据库中存储 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 时,它 returns 为真:

X509Certificate2.Equals

对于我 运行 需要证书才能正常工作的应用程序,我有时会收到一些错误 .pfx 提供给我的证书,我用来解决 [=44] =] 到机器并通过网络浏览器将其导出,创建一个新的 .pfx 文件,瞧瞧。

使用 copycert.pfx 文件给我同样的错误,但是当我尝试通过文件安装 copycert.pfx 或使用网络浏览器导入它时,我得到:"The import was successful" 消息,但是无法在 "Personal" 选项卡下找到已安装的证书,就像我安装原始 originalcert.pfx.

一样

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

我在做什么 wrong/is 代码中缺少 export/import?

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

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

这一行只转换证书的public部分。 RawData 属性 中从未存储过私钥信息。这意味着您无法从此字符串恢复原始 PFX。你真正应该做的是读取文件的内容并将其转换为 Base64 字符串而不触及 X509Certificate2 class。用这两个替换前两行发布的代码:

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