CryptoAPI - как проверить сертификат на вхождение в список отозванных

SQL-Talker
Дата: 30.05.2019 19:17:35
Как проверить сертификат что он не отозван?
В документации нашел список функций про CRL:
https://docs.microsoft.com/ru-ru/windows/desktop/SecCrypto/cryptography-functions#certificate-revocation-list-functions

Как ими пользоваться могу только предполагать.

Видимо так:
1. CertOpenSystemStore - Какое хранилище тут нужно открыть, как оно называется?
2. В цикле выполнять CertGetCRLFromStore или CertEnumCRLsInStore чтобы перебрать все CRL. Видимо на каждом шаге в конце вызывать CertFreeCRLContext
3. В каждом CRL искать свой сертификат CertFindCertificateInCRL

Вроде все.

Не понял для чего нужна CertCreateCRLContext

Еще вопрос - можно ли всегда исходить что CRL всегда содержится в хранилище? Или нужно самому откуда-то выкачивать его и заливать в хранилище? Или есть еще какие-то варианты?
Я просто не представляю как вообще это все работает.
Ghost Writer
Дата: 30.05.2019 22:46:28
SQL-Talker,

есть специальные функции для проверки статуса сертификата (цепочек сертификатов), в том числе на отзыв.
CertCreateCertificateChainEngine / CertGetCertificateChain / CertFreeCertificateChain / CertFreeCertificateChainEngine

SQL-Talker
CertOpenSystemStore - Какое хранилище тут нужно открыть, как оно называется?
"CA"
SQL-Talker
Не понял для чего нужна CertCreateCRLContext
чтобы прочитать файл с диска или памяти, а не из хранилища.

SQL-Talker
Еще вопрос - можно ли всегда исходить что CRL всегда содержится в хранилище?

не всегда. зато при использовании CertCreateCertificateChainEngine / CertGetCertificateChain с определенными параметрами (и при условии, что установлен корневой сертификат, в сертификате есть расширение Точки распространения списков отзыва (CRL) (2.5.29.31)) и URL доступен) это не важно.
SQL-Talker
Дата: 31.05.2019 08:33:22
Ghost Writer
зато при использовании CertCreateCertificateChainEngine / CertGetCertificateChain ...
Стоп, я так-то думал, функции "Certificate Chain Verification Functions" со списками отзыва никак не связаны (проверка цепочки сертификатов это у меня следующая задача)

Можно подробнее про списки отзыва и CertCreateCertificateChainEngine / CertGetCertificateChain, плиз
Ghost Writer
Дата: 31.05.2019 09:12:33
SQL-Talker,

CertGetCertificateChain параметр dwFlags
там даже экземпл есть, хоть и без флагов CERT_CHAIN_REVOCATION_CHECK_...
SQL-Talker
Дата: 31.05.2019 10:09:16
Ghost Writer,

В описании функции CertGetCRLFromStore указано
https://docs.microsoft.com/en-us/windows/desktop/api/Wincrypt/nf-wincrypt-certgetcrlfromstore
The new Certificate Chain Verification Functions are recommended instead of this function.
Означает ли это что не нужно вообще проверять сертификат посредством функций которые я приводил в первом посте (CertGetCRLFromStore/CertEnumCRLsInStore , CertFindCertificateInCRL) , а достаточно проверить цепочку сертификатов?
Ghost Writer
Дата: 31.05.2019 10:17:10
SQL-Talker,

да, если нужен только статус без времени и причины отзыва.
SQL-Talker
Дата: 31.05.2019 10:34:17
Ghost Writer,

1. Т.е. достаточно просто вызвать CertGetCertificateChain и в случае если результат = True , то анализировать значение pChainContext->TrustStatus.dwErrorStatus ?

2. Перед вызовом CertGetCertificateChain нужно ли вызывать CertCreateCertificateChainEngine или это совершенно необязательно?
Ghost Writer
Дата: 31.05.2019 10:40:36
SQL-Talker,

1. Да.
2. CertGetCertificateChain использует hChainEngine, полученный с помощью CertCreateCertificateChainEngine
SQL-Talker
Дата: 31.05.2019 10:49:18
Ghost Writer,

2. В примере в качестве параметра hChainEngine указан NULL, почему я и спросил про обязательность. Т.е., надо полагать, CertCreateCertificateChainEngine все-таки лучше вызывать, а в чем тогда идея кода в примере, где первым параметром CertGetCertificateChain идет NULL ?
Ghost Writer
Дата: 31.05.2019 11:01:01
SQL-Talker
а в чем тогда идея кода в примере, где первым параметром CertGetCertificateChain идет NULL ?
сам не пойму, ведь hChainEngine предварительно создается при помощи CertCreateCertificateChainEngine но не используется )
ну написано NULL значит параметры по умолчанию. только какие они хз. так что лучше самому контролировать процесс.