【问题标题】:Store and retrieve private key in database在数据库中存储和检索私钥
【发布时间】:2017-12-30 15:06:16
【问题描述】:

我在使用 FromXmlString 方法从 XML 加载 X509Certificate2 时遇到了困难。我得到的例外是m_safeCertContext is an invalid handle.

System.Security.Cryptography.CryptographicException occurred
  HResult=-2146233296
  Message=m_safeCertContext is an invalid handle.
  Source=System
  StackTrace:
       at System.Security.Cryptography.X509Certificates.X509Certificate2.get_HasPrivateKey()
       at System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
...

为了创建 XML,我正在加载 .pfx 文件并使用 ToXmlString;

var certificate = new X509Certificate2(
    @"D:\public_privatekey.pfx",
    (string)null,
    X509KeyStorageFlags.Exportable
    );

var exportedPrivate = certificate.PrivateKey.ToXmlString(true);

这会生成像这样开始的 XML...

<RSAKeyValue><Modulus>y0iuejYHYajI...

要重新创建证书,我正在使用...

var certificate = new X509Certificate2();
certificate.PrivateKey.FromXmlString(xml); 

其中xml 是一个包含XML 内容的字符串。

在调用FromXmlString 时会引发异常。

我是使用证书的新手,但我最好的猜测是.pfx 包含公钥和私钥,可能还有一些其他重要数据,我需要所有这些才能获得有效的 X509 证书.

但是我无法直接在X509Certificate2 上找到ToXmlString 和FromXmlString。我该怎么做?感谢您的建议。

【问题讨论】:

  • 在SQL中将整个.pfx文件作为二进制列会更容易。
  • “我在使用 FromXmlString 方法从 XML 加载 X509Certificate2 时遇到困难” 我不知道 X509Certificate2 有 FromXmlString 方法,哪个版本的 .你在用网吗?
  • certificate.PrivateKey 在您实际加载证书之前不会存在。

标签: c# encryption cryptography x509certificate2


【解决方案1】:

X.509 证书以称为 ASN.1/DER 编码的结构化二进制格式进行描述。 ASN.1 是一种描述证书内容的语言,DER 是符合该 ASN.1 结构的内容的编码。

可以使用Export 方法使用内容类型X509ContentType.Cert 对您的内存证书与私钥分开进行编码。您还可以通过指定Pfx 或Pkcs12 将证书和私钥导出回“pfx”。如果您需要 XML,那么您可以使用 base 64 对字节数组结果进行编码。然后您可以将其存储到 XML CDATA 元素中。


通常,私钥也以二进制 PKCS#8 容器格式存储,也使用 ASN.1 / DER 定义。但是,Microsoft 已选择默认将密钥存储为 Microsoft 专有的 XML 格式。

【讨论】:

  • is compatible with absolutely nothing on the market -- 兼容微软软件。
  • 感谢 Maarten,Export 和 Import 方法是我忽略的。我认为证书会有 Xml 函数,就像私钥一样,但是使用 BASE64 编码它就像一个魅力。
  • 将证书的所有字段写入 XML 将是一项艰巨的任务。有一种称为 XER 的标准化方法,但使用不多(它只是将使用 ASN.1 指定的数据字段保存到 XER - XML 编码规则)。但是,由于证书上的签名是通过 DER 编码计算的,因此您必须在验证签名之前将所有内容都转换回 DER :) 所以不,将证书保存到 XML 不是一个好主意;需要时使用 base 64。
猜你喜欢
  • 2022-12-10
  • 2011-03-12
  • 2014-06-05
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多