C# 是否使用X509certificate从XML文件提取公钥?

C# 是否使用X509certificate从XML文件提取公钥?,c#,x509certificate,saml,C#,X509certificate,Saml,我正试图从XML文件中创建C#中的X509Certificate2对象。XML文件是我们从供应商处收到的SAML元数据文件 我试图从以下XML元素中提取公钥: <X509Data> <X509Certificate> MIIB7DCCAVmgAwIBAgIQPjHcBTL63bBLuJZ88RcrCjAJBgUrDgMCHQUAMBExDzANBgNVBAMT BnJvbWVvazAgFw0xMDAzMTUwMjI1MjZaGA8yMTEw

我正试图从XML文件中创建C#中的
X509Certificate2
对象。XML文件是我们从供应商处收到的
SAML
元数据文件

我试图从以下XML元素中提取公钥:

<X509Data>
    <X509Certificate>
      MIIB7DCCAVmgAwIBAgIQPjHcBTL63bBLuJZ88RcrCjAJBgUrDgMCHQUAMBExDzANBgNVBAMT
      BnJvbWVvazAgFw0xMDAzMTUwMjI1MjZaGA8yMTEwMDIxOTAyMjUyNlowETEPMA0GA1UEAxMG
      cm9tZW9rMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDAu/sBh13A27rR7gJpZsI6zCee
      TXNohQWlq2z6Zg8Oxzsy5JoVV 
    </X509Certificate>
</X509Data> 

MIIB7DCCAVMGAWIBAGIQPJHCBTL63BBLUJZ88RCJAJBGURDGMCHQUAMBEXDZANBGNBAMT
BNJVBWVVAZAGFW0xMDAZMTUWMJI1MJZAGA8YMTEWMDIXOTAYMJUYNEAWEMA 0GA1EAXMG
CM9TZW9RMIGFMA0GCSQGSIB3DQEBAQAA4GNADCBIQKBGQDAU/sBh13A27rR7gJpZsI6zCee
TXNohQWlq2z6Zg8Oxzsy5JoVV

在C#中是否有方法从XML元素中提取.cer文件或公钥

在不知道X509证书是如何编码的情况下,这是一个很难回答的问题,但假设您拥有编码功能,您可以执行以下操作:

  var document = new XmlDocument();
  document.LoadXml(txtXml.Text);
  var cert = document.SelectSingleNode("X509Data/X509Certificate").InnerText;
  /*...Decode text in cert here (may need to use Encoding, Base64, UrlEncode, etc) ending with 'data' being a byte array...*/ 
  var x509 = new X509Certificate2(data);

然后,您应该能够使用标准文件I/O逻辑将文件写入磁盘。

Randall的答案是正确的。但在SAML令牌中,我相信证书将始终是Base64编码的。 因此,对于子孙后代来说,对我有效的解决方案是:

var document = new XmlDocument();
document.LoadXml(txtXml.Text);
var certificateStr = document.SelectSingleNode("X509Data/X509Certificate").InnerText;
byte[] data = Convert.FromBase64String(certificateStr);
var x509 = new X509Certificate2(data);
Console.WriteLine("Public Key Format: {0}", x509.PublicKey.EncodedKeyValue.Format(true));

看起来像是base64编码的数据(但根据openssl,我没有解码为X509证书)。类似的问题(对于Java)也在这里:。谢谢!正是我需要的!