我希望能够监视受信任方ADFS的签名证书。一种方法是手动读取联合身份验证元数据XML并解析KeyInfo-元素,然后从以base64编码的数据中创建X509Certificate
:see 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解析吗?
干杯!
答案 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;
}