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

How to read thumbprints of signing certificates from Federation Metadata XML?

我希望能够监控可信方 ADFS 的签名证书。一种方法是手动读取联合元数据 XML 并解析 KeyInfo - 元素并从 base64 编码数据创建 X509Certificatesee this good article

经过一些阅读,我发现 MetadataSerializer 我可以轻松地创建 EntityDescriptor 以便从 XML 进一步调查。例如,可以获取 Windows 实时登录的元数据:

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 解析来获取指纹吗?

干杯!

这一切都归结为使用 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;
 }