Найти сертификат X509 в коллекции, где имя эмитента соответствует определенному значению - PullRequest
0 голосов
/ 30 августа 2018

В моем приложении мне нужно найти сертификаты в местном магазине, которые соответствуют имени определенного эмитента. Итак, что я делал раньше было:

LocalStore.Certificates.Find(X509FindType.FindByIssuerName, "My Common Name", True)

Но так как новый сервер сертификатов был установлен и использует активную директорию, поле «Эмитент» моих сертификатов имеет дополнительные атрибуты (значения DC). Полная строка выглядит так:

"CN=My Common Name, DC=MyCompanyDomain, DC=local"

Это не позволит мне использовать метод Find, как раньше, и любая комбинация значений CN, DC для меня не сработала.

Это то, что я пробовал в ImmediateWindow:

?LocalStore.Certificates.Item(0).IssuerName
{System.Security.Cryptography.X509Certificates.X500DistinguishedName}
    Name: "CN=My Common Name, DC=MyCompanyDomain, DC=local"
    Oid: {System.Security.Cryptography.Oid}
    RawData: {Length=85}
    m_distinguishedName: "CN=My Common Name, DC=MyCompanyDomain, DC=local"
    m_oid: {System.Security.Cryptography.Oid}
    m_rawData: {Length=85}
?LocalStore.Certificates.Find(X509FindType.FindBySubjectName, "My Common Name", True).Count 
0
?LocalStore.Certificates.Find(X509FindType.FindByIssuerName, "My Common", True).Count 
0
?LocalStore.Certificates.Find(X509FindType.FindByIssuerDistinguishedName, "My Common Name", True).Count 
0
?LocalStore.Certificates.Find(X509FindType.FindByIssuerDistinguishedName, "My", True).Count 
0

1 Ответ

0 голосов
/ 30 августа 2018

Что вы, вероятно, хотите, это FindByIssuerDistingushedName.

FindByIssuerName - нечувствительное к регистру совпадение подстроки с именем эмитента в прямом порядке с разделителями-запятыми и без пометки полей. Это не имеет большого смысла как предложение, поэтому давайте рассмотрим пример.

Обычный способ печати вещей в Windows (и .NET) на самом деле обратный, поэтому ваше отличительное имя эмитента, скорее всего, DC=local, DC=MyCompanyDomain, CN=My Common Name. FindByIssuerName превратит это значение в строку local, MyCompanyDomain, My Common Name, а затем будет соответствовать, если ваш ввод (без учета регистра) найден где-либо в этой строке.

  • "local, MyCompanyDomain, My Common Name": Yep
  • "local, mycompanyDOMAIN, мое общее имя": Yep
  • "местный": да
  • "м": да
  • "": Да
  • "банан": Нет

FindByIssuerDistinguishedName, с другой стороны, нечувствителен к регистру и равен той же строке, что и cert.Issuer возвращает. Таким образом, строка, которая у вас уже есть, будет соответствовать.

https://github.com/dotnet/corefx/blob/f252ef6d695176143aa46b855db5553fb6e44921/src/System.Security.Cryptography.X509Certificates/tests/FindTests.cs#L381-L406 показывает сохраняющие поведение модульные тесты для FindByIssuerName и FindByIssuerDistinguishedName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...