如何从联合身份验证元数据XML中读取签名证书的指纹?

时间:2019-06-26 11:55:33

标签: c# adfs federation

我希望能够监视受信任方ADFS的签名证书。一种方法是手动读取联合身份验证元数据XML并解析KeyInfo-元素,然后从以base64编码的数据中创建X509Certificatesee this good article

经过一番阅读,我发现MetadataSerializer可以轻松创建EntityDescriptor以便从XML进行进一步的研究。例如,可以获取Windows Live登录的元数据:

string uri = "https://login.microsoftonline.com/38cda3b4-71fa-4748-a48e-e50ef1ebfe00/federationmetadata/2007-06/federationmetadata.xml";
using (var reader = XmlReader.Create(uri))
{
    var serializer = new MetadataSerializer();
    serializer.CertificateValidationMode = X509CertificateValidationMode.None;
    EntityDescriptor metadata = (EntityDescriptor)serializer.ReadMetadata(reader);
}

描述符公开了属性RoleDescriptors,该属性只是将所有描述符包装在元数据中,包括用于加密或签名的安全密钥。但是我无法访问证书数据以读取指纹。请参见下面的简化代码:

// metadata from above
SecurityKeyIdentifierClause keyIdentifier = metadata.RoleDescriptors.First().Keys.First().KeyInfo[0];
// keyIdentifier.certificate ... => private, exposes XCertificate2

有什么想法可以使用这种方法而不是手动进行XML解析吗?

干杯!

1 个答案:

答案 0 :(得分:1)

所有归结为使用X509RawDataKeyIdentifierClause而不是其抽象基础:

 X509RawDataKeyIdentifierClause keyIdentifier = metadata.RoleDescriptors.First().Keys.First().KeyInfo[0] as X509RawDataKeyIdentifierClause;

 if ( keyIdentifier != null )
 {
      X509Certificate2 cert = new X509Certificate2(keyIdentifier.GetX509RawData());
      string thumbprint     = cert.Thumbprint;
 }