Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline PPP  
#1 Оставлено : 18 августа 2016 г. 18:44:44(UTC)
PPP

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.04.2013(UTC)
Сообщений: 43
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 11 раз
Коллеги, здравствуйте!

В разделе 4 документа "КриптоПро CSP Версия 3.9. Руководство программиста" сказано, что перед вызовом функции CryptSignHash сертификат должен быть проверен с помощью функции CertVerifyCertificateChainPolicy.

А с какими параметрами должна быть вызвана данная функция, чтобы выполнились необходимые проверки сертификата (списка отзыва сертификатов)? Есть где-нибудь пример работы с данной функцией?

С уважением,
Павел
Offline PPP  
#2 Оставлено : 23 августа 2016 г. 14:13:08(UTC)
PPP

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.04.2013(UTC)
Сообщений: 43
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 11 раз
Коллеги, добрый день!

Еще один вопрос в догонку...

Входным параметром для функции CertVerifyCertificateChainPolicy является PCCERT_CHAIN_CONTEXT (цепочка сертификатов), которая формируется с помощью функции CertGetCertificateChain. Функция CertGetCertificateChain выполняет проверки актуальности сертификата и списка отзыва сертификатов: сроки, цепочку, отозванность.
Почему нельзя при проверки актуальности сертификата обойтись только функцией CertGetCertificateChain? Какие необходимые проверки сертификата "закрывает" функция CertVerifyCertificateChainPolicy?

С уважением
Offline Павел Смирнов  
#3 Оставлено : 24 августа 2016 г. 10:49:14(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Рекомендуемым способом проверки является вызов CertVerifyCertificateChainPolicy после CertGetCertificateChain. В данном случае вы можете проверить дополнительные вещи, указав нужную политику. Но если ничего дополнительного проверять не требуется, то проверки CertGetCertificateChain достаточно.
Техническую поддержку оказываем тут.
Наша база знаний.
Offline PPP  
#4 Оставлено : 25 августа 2016 г. 10:30:03(UTC)
PPP

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.04.2013(UTC)
Сообщений: 43
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 11 раз
Ок, спасибо.
Offline PPP  
#5 Оставлено : 26 сентября 2016 г. 14:14:29(UTC)
PPP

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.04.2013(UTC)
Сообщений: 43
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 11 раз
Коллеги, добрый день!

Не работает функция CertVerifyCertificateChainPolicy с флагом CPCERT_CHAIN_POLICY_SIGNATURE. Функция GetLastError, вызванная после функции CertVerifyCertificateChainPolicy, возвращает 2.
Если вместо флага CPCERT_CHAIN_POLICY_SIGNATURE поставить флаг CERT_CHAIN_POLICY_BASE, то все ОК.

Прошу помочь разобраться.

В прикрепленном архиве направляю ключевую информацию (сертификаты, crl, закрытый ключ), которую использовал. Сертификаты получены с помощью тестового УЦ КриптоПро, на сайте КриптоПро.
Keys.zip (4kb) загружен 3 раз(а).


Ниже приведен исходный код функции проверки сертификата:


Код:
uint_t verifyCertificateForSign(PCCERT_CONTEXT pCertContext)
{
	
	assert(pCertContext);

	uint_t dwFlags = CERT_CHAIN_REVOCATION_CHECK_CHAIN | CERT_CHAIN_CACHE_END_CERT | CERT_CHAIN_REVOCATION_CHECK_CACHE_ONLY;
	

	CERT_ENHKEY_USAGE EnhkeyUsage;
	EnhkeyUsage.cUsageIdentifier = 0;
	EnhkeyUsage.rgpszUsageIdentifier = NULL;

	CERT_USAGE_MATCH CertUsage;
	CertUsage.dwType = USAGE_MATCH_TYPE_AND;
	CertUsage.Usage  = EnhkeyUsage;

	CERT_CHAIN_PARA ChainPara;
	ChainPara.cbSize = sizeof(CERT_CHAIN_PARA);
	ChainPara.RequestedUsage = CertUsage;

	PCCERT_CHAIN_CONTEXT pChainContext = 0;

	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
			dwFlags,
			NULL,                  // currently reserved
			&pChainContext))       // return a pointer to the chain created
	{
		uint_t err = GetLastError();
		
		return err;	
	}

	

	// Параметры для CertVerifyCertificateChainPolicy. 
	// Заполняем структуру с параметрами проверки
	CERT_CHAIN_POLICY_PARA						chainPolicyPara			= { sizeof(chainPolicyPara) };
	CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_PARA	extraChainPolicyPara	= { sizeof(extraChainPolicyPara) };
	
	chainPolicyPara.dwFlags = CPPRIVATEKEY_USAGE_PERIOD_CERT_CHAIN_POLICY_SKIP_END_CERT_FLAG; //не проверять срок действия закрытого ключа конечного сертификата


	//Готовим структуру для получения статусов
	CERT_CHAIN_POLICY_STATUS					chainPolicyStatus		= { sizeof(chainPolicyStatus) };
	CPSIGNATURE_EXTRA_CERT_CHAIN_POLICY_STATUS	extraChainPolicyStatus	= { sizeof(extraChainPolicyStatus) };
	
	chainPolicyStatus.pvExtraPolicyStatus = &extraChainPolicyStatus;

	uint_t resultCode = 0;

	// Зовём CertVerifyCertificateChainPolicy
	if(!CertVerifyCertificateChainPolicy(
				CPCERT_CHAIN_POLICY_SIGNATURE, 
				pChainContext, 
				&chainPolicyPara,
				&chainPolicyStatus))
	{
		resultCode = GetLastError();
		
		return resultCode;
	}
	

	resultCode = chainPolicyStatus.dwError;

	// В случае, если имеется расширенный ответ
	if (extraChainPolicyStatus.dwError)
		resultCode = extraChainPolicyStatus.dwError;
	

	CertFreeCertificateChain(pChainContext);

	return resultCode;
}


С уважением
Offline Павел Смирнов  
#6 Оставлено : 26 сентября 2016 г. 14:23:02(UTC)
Павел Смирнов

Статус: Вам и не снилось

Группы: Администраторы
Зарегистрирован: 24.12.2007(UTC)
Сообщений: 831
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 48 раз в 44 постах
Фича Revocation Provider в составе CSP установлена?
Техническую поддержку оказываем тут.
Наша база знаний.
Offline PPP  
#7 Оставлено : 26 сентября 2016 г. 18:08:24(UTC)
PPP

Статус: Активный участник

Группы: Участники
Зарегистрирован: 24.04.2013(UTC)
Сообщений: 43
Российская Федерация
Откуда: Москва

Сказал(а) «Спасибо»: 11 раз
Установил Revocation Provider, заработало как надо.

Большое спасибо!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.