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.pfx
和 C:\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");
我基本上需要将 .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.pfx
和 C:\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");