如何从联合元数据 XML 中读取签名证书的指纹?
How to read thumbprints of signing certificates from Federation Metadata XML?
我希望能够监控可信方 ADFS 的签名证书。一种方法是手动读取联合元数据 XML 并解析 KeyInfo - 元素并从 base64 编码数据创建 X509Certificate
:see 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;
}
我希望能够监控可信方 ADFS 的签名证书。一种方法是手动读取联合元数据 XML 并解析 KeyInfo - 元素并从 base64 编码数据创建 X509Certificate
:see 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;
}