16.09.2005 16:57:41В сертификате находится URL со списком отзывов. Ответов: 10
Ivan
С какими параметрами вызывать CertGetCertificateChain, чтобы автоматически эта функция проверила удаленный список отзывов? Или необходимы иные действия?
В MSDN есть такие ключи:
CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY Revocation checking only accesses cached URLs.
Windows NT: This flag is not supported.

и

CERT_CHAIN_CACHE_ONLY_URL_RETRIEVAL Uses only cached URLs in building a certificate chain. The Internet and intranet are not searched for URL-based objects.
Note This flag is not applicable to revocation checking. Set CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY to use only cached URLs for revocation checking.

Но URL-то будет указывать на сервер в интернете, там же сказано - не будет искаться. Плюс, NT не держится.
 
Ответы:
27.10.2005 10:38:12Кирилл
Аналогичный вопрос: как реализовать OCSP?
27.10.2005 11:52:14Kirill Sobolev
Эти флаги как раз чтобы не лезть по CDP. По умолчанию она как полезет, для этого полезно таймаут, чтобы не тормозила если CDP недоступна.
27.10.2005 12:48:24Кирилл
Т.е. получается, что не надо указывать никакие ключи?
Сейчас кусок проверяющего кода выглядит так:
HCERTCHAINENGINE hChainEngine;
CERT_CHAIN_ENGINE_CONFIG ChainConfig;
PCCERT_CHAIN_CONTEXT pChainContext;
CERT_ENHKEY_USAGE EnhkeyUsage;
CERT_USAGE_MATCH CertUsage;
CERT_CHAIN_PARA ChainPara;
DWORD dwFlags = CERT_CHAIN_REVOCATION_CHECK_CHAIN;



//---------------------------------------------------------
// Initialize data structures.

EnhkeyUsage.cUsageIdentifier = 0;
EnhkeyUsage.rgpszUsageIdentifier=NULL;
CertUsage.dwType = USAGE_MATCH_TYPE_AND;
CertUsage.Usage = EnhkeyUsage;
ChainPara.cbSize = sizeof(CERT_CHAIN_PARA);
ChainPara.RequestedUsage=CertUsage;

ChainConfig.cbSize = sizeof(CERT_CHAIN_ENGINE_CONFIG);
ChainConfig.hRestrictedRoot= NULL ;
ChainConfig.hRestrictedTrust= NULL ;
ChainConfig.hRestrictedOther= NULL ;
ChainConfig.cAdditionalStore=0 ;
ChainConfig.rghAdditionalStore = NULL ;
ChainConfig.dwFlags = CERT_CHAIN_CACHE_END_CERT;

ChainConfig.dwUrlRetrievalTimeout= 0 ;
ChainConfig.MaximumCachedCertificates=0 ;
ChainConfig.CycleDetectionModulus = 0;



if(CertCreateCertificateChainEngine(
&ChainConfig,
&hChainEngine))
{
}
else
{
}

if(CertGetCertificateChain(
NULL,
pCertContext,
NULL,
NULL,
&ChainPara,
dwFlags,
NULL,
&pChainContext))
{
}
else
{
SetError();
}

Какие ключи надо указать, чтобы поиск происходил по CDP?
И что насчет таймаута? Есть стандартные способы или имеется в виду самому реализовать поток ожидания?
27.10.2005 12:54:23Kirill Sobolev
Поиск и так будет по CDP.
Для таймаута надо заполнить поле dwUrlRetrievalTimeout, но это вроде как только начиная с win2000 работает.
27.10.2005 13:05:41Кирилл
Правильно ли я понял, что в приведенном куске кода, при проверке, приложение будет стучаться к серверу, указанному в сертификате? Ключи менят не надо?
Насчет таймаута, - вся структура CERT_CHAIN_ENGINE_CONFIG поддерживаешься лишь в 2000, ХР.
27.10.2005 13:37:31Kirill Sobolev
Если нужно - будет. Т.е. сначала посмотрит хранилища, потом кэш а только потом уже полезет онлайн.
28.10.2005 11:32:54Кирилл
Понятно, спасибо.
А для проверки в Win98 надо использовать Capicom? Но тогда где можно найти нормальное ее описание? В МСДН все урезанное, тут этого нет, на майкрософте не найти ничего. Конкретней, возвращаемые ошибки при проверке. Или есть ли где-нибудь примеры? В CC2RINST нет ничего подобного.
28.10.2005 11:41:11Kirill Sobolev
Почему, можно и CryptoAPI обойтись.
И CertCreateCertificateChainEngine и CertGetCertificateChain:
Windows NT/2000/XP: Included in Windows NT 4.0 SP4 and later.
Redistributable: Requires Internet Explorer 5 or later on Windows 95/98.
Описания CAPICOM лучше чем от MS Вы вряд ли найдете :)
28.10.2005 14:28:38Кирилл
А где тогда можно найти описание возвращаемых ошибок? Описания даже у майкрософта - 0!
28.10.2005 14:43:24Kirill Sobolev
Ну FormatMessage может помочь... А о каких именно ошибках идет речь?