получение свойств сертификата

Автор SeregaZ, 10 Сентябрь 2013, 23:31:51

« предыдущая тема - следующая тема »

0 Пользователей и 1 Гость просматривают эту тему.

Вниз

SeregaZ

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


если первый случай - то эти самые политики перечислены в поле сертификата "улучшенный ключ" и их можно прочитать командой CertGetIntendedKeyUsage

а вот как получить свойство "все политики"? какой командой можно воспользоваться?

Sergey

Добрый день.

Надпиь все политики применения означает что в оснаске windows в свойствах сертификата (кнопка свойства в вкладке состав) выбранно "Разрешить все назначения для этого сертификата"
Данные свойства напрямую не относятся к сертификату.

SeregaZ

э неееет  :)  все политики означает возможность использования сертификатом всех 31(или 32) политик, которые существуют. сертификат, имеющий изначально 1-2 политики, тоже имеет эту пометку "Разрешить все назначения для этого сертификата" - но это вовсе не означает что у него есть все политики применения.

Sergey

Для примера возьмем сертификат от Equifax Secure

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

Возьмем другой пример:

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

Из этого следует, что данное описание не относится к сертификату, как и поле "Отпечаток" в вкладке состав.

SeregaZ

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

однако отвлеклись. я говорю о том, что наличие пометки "разрешить все назначения для этого сертификата" вовсе не означает наличие всех существующих политик, что было заявлено во втором посте данной темы.
когда 31 (или 32 не помню точно) политики разрешены - то статус стоит "разрешены все политики", а если сертификат имеет всего 1-2, 5, 10 политик - то статуса "разрешены все полтики" нет, вместо этого там перечислены только эти политики в качестве разрешенных. галка "разрешить все назначения для этого сертификата" - по сути разрешает все разрешенные для конкретного сертификата, а не все имеющиеся в природе.

вот я и ищу команду, которая бы вернула мне свойство сертификата "разрешены все существующие в природе политики". свойство "разрешены все из имеющихся в данном сертификате" мне не нужно.

Sergey

Цитата: SeregaZ от 12 Сентябрь 2013, 15:41:14
вот я и ищу команду, которая бы вернула мне свойство сертификата "разрешены все существующие в природе политики". свойство "разрешены все из имеющихся в данном сертификате" мне не нужно.

Еще раз хочу заметить что данное свойство не относится напрямую к сертификату, а лишь есть атрибут этого сертификата в хранилище сертификатов windows. Для получения атрибутов сертификата можно воспользоваться функцией CertGetStoreProperty

SeregaZ

нашел тут ссылку:
http://support.microsoft.com/kb/216831/ru

и там есть пример содержания сертификата. в этом примере интересует момент Certificate Extensions: 6 и далее идет перечисление OID. потом есть еще ссылка на описание OID http://www.alvestrand.no/objectid/2.5.29.32.0.html - в итоге, если в том Certificate Extensions будет находится OID 2.5.29.32.0 - получается мой сертификат будет иметь как раз этот флаг "все политики применения"? правильно я полагаю?

если правильно - какой командой можно получить массив этих OID Certificate Extensions?

Sergey

Я указал не совсем ту функцию CertSetStoreProperty получает атрибуты хранилища сертификатов, для получения атрибутов непосредственно сертификата используется функция:
BOOL WINAPI CertGetCertificateContextProperty(
PCCERT_CONTEXT pCertContext,
DWORD dwPropId,
void *pvData,
DWORD *pcbData
);


Для перечисление всех установленных атрибутов можно воспользоваться функцией CertEnumCertificateContextProperties
Единственное что стоит помнить что данные атрибуты можно выставить вручную сертификату CertSetCertificateContextProperty, и это не будет соответствовать действительным политикам сертификата.

Все расширения сертификата можно получить в структуре CERT_CONTEXT -> CERT_INFO -> CERT_EXTENSION

SeregaZ

12 Сентябрь 2013, 19:12:55 #8 Последнее редактирование: 12 Сентябрь 2013, 19:59:23 от SeregaZ
что-то у меня насчет обоих вариантов проблемы. начнем с простого CERT_CONTEXT -> CERT_INFO -> CERT_EXTENSION - я так полагаю там должен быть массив OID? однако вроде как в структурах не упоминается что должен быть массив, а читая *pCertContext\pCertInfo\rgExtension\pszObjId возвращает только один вариант OID - 2.5.29.19 или 2.5.29.14 или 2.5.29.15... по всей видимости который первый шел тот и показывает. а как до остальных достучаться?

***

так. тут понятно, массив. просто надо теперь разобраться как объявить его в структуре...

********************************************************************

второй вариант: CertGetCertificateContextProperty - какое именно значение dwPropId мне нужно указать? там список довольно внушительный. более менее по названию два подходят:
CERT_ENHKEY_USAGE_PROP_ID
Data type of pvData: A pointer to an array of BYTE values. The size of this array is specified in the pcbData parameter.
Returns an array of bytes that contain an ASN.1-encoded CERT_ENHKEY_USAGE structure. This structure contains an array of Enhanced Key Usage object identifiers (OIDs), each of which specifies a valid use of the certificate.

CERT_CTL_USAGE_PROP_ID
Data type of pvData: A pointer to an array of BYTE values. The size of this array is specified in the pcbData parameter.
Returns an array of bytes that contain an ASN.1-encoded CTL_USAGE structure.

который из них? или оба мимо тогда какой из того списка мне нужен?

***

походу они оба одно и тоже. значение этих констант 9. и это значение не встречается в энумерации свойств сертификатов. в моем случае повторяются:
24 (CERT_ISSUER_PUBLIC_KEY_MD5_HASH_PROP_ID)
25 (CERT_SUBJECT_PUBLIC_KEY_MD5_HASH_PROP_ID)
3 (CERT_SHA1_HASH_PROP_ID)
2 (CERT_KEY_PROV_INFO_PROP_ID)
20 (CERT_KEY_IDENTIFIER_PROP_ID)
4 (CERT_MD5_HASH_PROP_ID)
15 (CERT_SIGNATURE_HASH_PROP_ID)

еще бывает 11 CERT_FRIENDLY_NAME_PROP_ID у некоторых (там где видимо вручную понятное имя помечено было)

Sergey

У меня нет возможности проверить, но скорее всего rgExtension это массив структур CERT_EXTENSION.

SeregaZ

13 Сентябрь 2013, 14:52:10 #10 Последнее редактирование: 13 Сентябрь 2013, 15:30:14 от SeregaZ
массив я так и не получил... выбивает и все тут. но прочитал что примерно там должно быть взяв больший диапазон памяти и вышло что-то типа:
2.5.29.15

2.5.29.35

    840.113549.1.1.1

1.2.840.113549.1.1.5

1.2.840.113549.1.1.1

2.5.29.14


хотя количество итемов в массиве должно быть 3 штуки. сертификат этот имеет флаг "все политики применения", но как видно свойства 2.5.29.32 тут нет. значит оно берется не отсюда. будут еще идеи? :)

каким образом в той ссылке http://support.microsoft.com/kb/216831/ru они получили содержимое сертификата? там представлен сертификат, имеющий конкретные флаги политик, вот я думаю если загнать свои имеющие все политики в эту программу и посмотреть различие - то думаю будет видно где искать это свойство.

***

ага... нашлось: To convert to binary, type CertUtil -decode cert.txt cert.cer .

***

однако ничего мне особо и не дало это изучение сертификатов :) вся разница лишь в том, что у сертификата с конкретными политиками есть дополнительные поля - улучшенный ключ например, а у того, который все политики применения - такого ключа нет. вот теперь понять бы - это самое отсутствие является ли 100% гарантией что сертификат имеет все политики?

Sergey

Мне кажется идет путаница понятий. При отображении сертификата ОС может по своему усмотрению выводить поля сертификата, и это может не совпадать с реальными данными в сертификате.
Нужно исходить из конечной цели.
Например:
1. УЦ выпускает сертификат для системы 1 и включает в него политику применения сертификата 1, но при этом в регламенте УЦ еще включается политика 0.
2. Система 1 при получении сертификата определяет может ли данный сертификат использоваться или нет, и она проверяет включена ли политика 1 в сертификат. При этом ей все равно есть ли там еще какие либо политики.
3. Системе 5 неважно какой она получает сертификат, поэтому она непроверяет политики сертификата.
4. Система 9 проверяет политики сертификата и ограничивает пользователя по каким-то принципам, но если в сертификате нет политики то она либо говорит что данным сертификатом нельзя пользоваться, либо наооборот для него доступны все операции.

Далее самое важное в Инфраструктуре Открытых Ключей (сертификат это объект данной инфраструктуры) нет такого понятия что сертификат имеет все политики.

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


SeregaZ

в моем случае сертификат считается рабочим в двух случаях: когда выданы все политики применения, как на скриншоте, или когда в этом поле указано конкретно "идентификация клиента на сервере".

я конечно понимаю что это поле зависит от множества факторов, например:
в улучшенном ключе присутствует эта "идентификация клиента", но она выключена вручную в свойствах - сертификат не рабочий
сертификат имеет все политики применения, но опять таки в свойствах вручную выключена именно эта политика - сертификат не рабочий
сертификат имеет только одну политику - защиты почты - сертификат не рабочий

все эти проверки, я могу сделать. кроме той, чтобы вернула бы мне значение того поля "все политики применения". и поскольку разница между сертификатом, имеющем все политики, и сертификатом, имеющем 2-3 политики, всего-лишь в наличии улучшенного ключа - то правильно ли условие, что если улучшенный ключ отсутствует - значит сертификат имеет все политики применения? (все политики применения в смысле наличие прав выполнять те 30+ задач, что имеются у сертификата - идентификация клиента, сервера, защиты почты, штампы времени и тд)

Sergey

Все зависит от того как оно будет использоваться в системе, с точки зрения ИОК отсутствие того или иного поля не означает что данный сертификат можно использовать как угодно. Некоторые системы не проверят квитанцию метки времени если она была поставлена без соответствующего атрибута сертификата. И если в оснаске windows включить атрибут использование сертификата как "идентификация клиента на сервере" при этом отправить данный сертификат на сервер, то на самом сервере это проверка уже не пройдет.

Вверх