在数据库

时间:2017-07-24 21:44:51

标签: c# encryption cryptography x509certificate2

我很难使用X509Certificate2方法从XML加载FromXmlString。我得到的例外是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证书。

但我无法直接在ToXmlString找到FromXmlStringX509Certificate2。我该怎么做?谢谢你的任何建议。

1 个答案:

答案 0 :(得分:1)

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

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

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