我很难使用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
找到FromXmlString
和X509Certificate2
。我该怎么做?谢谢你的任何建议。
答案 0 :(得分:1)
X.509证书以结构化二进制格式描述,称为ASN.1 / DER编码。 ASN.1是描述证书内容的语言,DER是符合ASN.1结构的内容的编码。
可以使用内容类型X509ContentType.Cert
使用Export
方法将内存证书与私钥分开编码。您还可以通过指定Pfx
或Pkcs12
将证书和私钥导回“pfx”。如果需要XML,则可以使用base 64对字节数组结果进行编码。然后,您可以将其存储到XML CDATA元素中。
通常,私钥也存储在二进制PKCS#8容器格式中,也使用ASN.1 / DER定义。但是,Microsoft默认选择将密钥存储为Microsoft专有的XML格式。