2015-10-19 5 views
2

У меня есть объект X509Certificate2, полученный из X509Store. Я хочу получить эмитента этого сертификата, но только два свойства, предлагаемые этим объектом, - X509Certificate2.Issuer и X509Certificate2.IssuerName, где .Issuer является своего рода вводящим в заблуждение, поскольку оно возвращает строку, которая является в основном именем эмитента.Извлечение эмитента объекта X509Certificate2

Оба этих объекта могут в наибольшей степени вернуть Distinguished Name, но DN не уникальны, не так ли? Поэтому я не хочу использовать метод X509Certificate2Collection.Find с флагом X509FindType.FindByIssuerDistinguishedName.

Как я могу получить выдачу сертификата и убедиться, что у меня есть «правильный». Примечание. Мне не нужно использовать объект X509Certificate2. Альтернативы приветствуются.

ответ

2

Если вы правильно поняли, у вас есть сертификат и вы хотите найти сертификат эмитента. Это можно сделать следующим образом:

  1. проверить, не совпадают ли поля Листа сертификата и эмитента. В противном случае сертификат является эмитентом (самозаверяющим сертификатом)

  2. Идентификатор объекта X509Chain: X509Chain.Build метод. Изучить свойство ChainElements (коллекция) и элемент в индексе 1 является эмитентом.

    using System.Security.Cryptography.X509Certificates; 
    
    namespace Name { 
        class Class1 { 
        public static X509Certificate2 GetIssuer(X509Certificate2 leafCert) { 
         if (leafCert.Subject == leafCert.Issuer) { return leafCert; } 
         X509Chain chain = new X509Chain(); 
         chain.ChainPolicy.RevocationMode = X509RevocationMode.NoCheck; 
         chain.Build(leafCert); 
         X509Certificate2 issuer = null; 
         if (chain.ChainElements.Count > 1) { 
          issuer = chain.ChainElements[1].Certificate; 
         } 
         chain.Reset(); 
         return issuer; 
        } 
    } 
    } 
    
+0

Это было его! Решение X509Chain было решением. – Mike

Смежные вопросы