08.12.2006 12:26:57Использование CertVerifyCertificateChainPolicy Ответов: 2
Александр Хилько
Строю цепочку сертификатов, используя связку CertCreateCertificateChainEngine и CertGetCertificateChain.
Код взял из http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2772

// Create the nondefault certificate chain engine.

if(!CertCreateCertificateChainEngine(&ChainConfig,&hChainEngine)) return FALSE;

if(!CertGetCertificateChain(
NULL, // Use the default chain engine.
pCertContext, // Pointer to the end certificate.
NULL, // Use the default time.
NULL, // Search no additional stores.
&ChainPara, // Use AND logic, and enhanced key usage
// as indicated in the ChainPara
// data structure.
CERT_CHAIN_REVOCATION_CHECK_CHAIN,
NULL, // Currently reserved.
&pChainContext)) // Return a pointer to the chain created.

Предположим, что все в порядке. Но для верификации цепочки, что является конечной целью, необходимо использование CertVerifyCertificateChainPolicy.

BOOL WINAPI CertVerifyCertificateChainPolicy(
LPCSTR pszPolicyOID,
PCCERT_CHAIN_CONTEXT pChainContext,
PCERT_CHAIN_POLICY_PARA pPolicyPara,
PCERT_CHAIN_POLICY_STATUS pPolicyStatus
); - так она описана в MSDN.
Для меня загвоздка заключается в правильном заполнении поля pPolicyPara, а говоря точнее в заполнении поля pvExtraPolicyPara структуры PCERT_CHAIN_POLICY_PARA.

pvExtraPolicyPara
The address of a pszPolicyOID-specific structure that provides additional validity policy conditions.
Это описание поля из MSDN.
А теперь вопрос, а откуда я могу узнать, структуру для какого pszPolicyOID мне надо использовать. Я так понимаю, что это определяется при анализе расширений, связанных с Police, каждого сертификата в цепочке.
Подскажите плиз.
 
Ответы:
08.12.2006 13:52:42Kirill Sobolev
Вот тут есть соотвествие между pszPolicyOID и pvExtraPolicyPara
http://msdn2.microsoft.com/en-gb/library/aa377163.aspx
08.12.2006 17:34:03Александр Хилько
Спасибо.
Эту страничку уже видел раньше. И есть один вопрос:
1. Я скачал с этого сайта файлик sample-2-0.zip. Там в файле WebClient.c обнаружил функцию :

static
DWORD
VerifyServerCertificate(
PCCERT_CONTEXT pServerCert,
PSTR pszServerName,
DWORD dwCertFlags)
{

В ней подставляется в поле pszPolicyOID значение CERT_CHAIN_POLICY_SSL. Есть ли гарантия, что верификация цепочки с учетом возможных policy extensions (в RFC очень немало этому внимания уделятся при описании верификации цепи) будет проведена корректно, согласно описанию в упомянутом уже RFC.
Добавлю, что значение dwAuthType у меня должно быть AUTHTYPE_CLIENT (в примере AUTHTYPE_SERVER).