Как читать отпечатки подписи сертификатов из федерации метаданных XML? - PullRequest
0 голосов
/ 26 июня 2019

Я хочу иметь возможность отслеживать подписи сертификатов доверенных сторон ADFS.Один из подходов заключается в том, чтобы вручную прочитать XML метаданных федерации и проанализировать элементы KeyInfo - и создать X509Certificate из данных в кодировке base64: см. Эту хорошую статью

После некоторого чтения я нашелчто 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 Ответ

1 голос
/ 26 июня 2019

Все сводится к использованию 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;
 }
...