19.05.2006 11:16:28Получение CommonName из сертификата (несколько CN в одном) Ответов: 2
ppvlad
Здравствуйте, уважаемые.

Я хочу, имея сертификат (контекст), получить значение, которое отображает IE в поле "Кому выдан" свойств сертификата. Я его интерпретирую как имя владельца сертификата и использую в программе.

Я считаю, что это Subject - CommonName, извлекаю это так:
CryptDecodeObjectEx даёт мне нужную структуру из которой я извлекал нужный атрибут вызовом CertFindRDNAttr(szOID_COMMON_NAME, pvStructInfo)
и всё работало замечательно, для сертификатов у которых CN один. Но при парсинге сертификата, выданного CA от Microsoft 2003 Server, оказалось, что в этих сетификатах два атрибута CN.

Subject: CN=Иванов Иван Иванович, CN=Users, ...

и CertFindRDNAttr возвращает второй CN "Users" (не знаю, "второй" или последний или первый... смотря как считать, важно что "не тот, что мне надо").

Но в то-же время в IE "Кому выдан" пишется совершенно предсказуемо "Иванов Иван Иванович".

В связи с этим вопрос: как правильно получить "Кому выдан"?

1. можно ли как-то извлечь все атрибуты CN ?
2. вариант неэстетичный - парсить Subject самому и вкусить все CN вручную.

Что посоветуете? Спасибо заранее.
 
Ответы:
19.05.2006 12:48:07Kirill Sobolev
Он второй с конца (если вообще CN последний атрибут). Атрибуты имени окно просмотра сертификата показывает в обратном порядке.
Для вытаскивания нужного (т.е. 1го с конца) без распарсивания можно воспользоваться CertGetNameString(..,CERT_NAME_SIMPLE_DISPLAY_TYPE,..)
19.05.2006 14:01:18ppvlad
Спасибо большое, с CertGetNameString всё заработало как надо и гораздо проще чем у меня было.