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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Илья Муромец  
#1 Оставлено : 19 мая 2010 г. 15:36:14(UTC)
Илья Муромец

Статус: Участник

Группы: Участники
Зарегистрирован: 25.12.2008(UTC)
Сообщений: 25
Откуда: Че

С помощью функций CryptoAPI сформировал я подпись в формате PKCS#7
Формат правильный поскольку, утилита certutil -v отработала и отобразила сертификат, которым подписано.

но проблемы начинаются при верификации подписи средствами того же CryptoAPI.


Изначально использовал функцию CryptVerifyDetachedMessageSignature(...), заполняя параметры верификации так:
Код:

	CRYPT_VERIFY_MESSAGE_PARA VerifyPara;
	ZeroMemory(&VerifyPara, sizeof(VerifyPara));

	VerifyPara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
	VerifyPara.hCryptProv = NULL;
	VerifyPara.dwMsgAndCertEncodingType = MY_TYPE;
	//VerifyPara.pfnGetSignerCertificate = NULL;
	VerifyPara.pfnGetSignerCertificate = NULL;
	VerifyPara.pvGetArg = NULL;

на что функция возвращала FALSE и GetLastError() равным CRYPT_E_NOT_FOUND

курение гугла, яндекса и прочих наркотических веществ привело меня к использованию низкоуровневых функций сообщений.
в итоге пришёл к таким результатам
1) создаю и заполняю сообщение типа HCRYPTMSG
Код:
	 msg = CryptMsgOpenToDecode(pVerifyPara->dwMsgAndCertEncodingType,
		CMSG_DETACHED_FLAG, 0, pVerifyPara->hCryptProv, NULL, NULL);
		ret = CryptMsgUpdate(msg, pbDetachedSignBlob, cbDetachedSignBlob, TRUE);
		if(ret) {
             DWORD i;
			 for (i = 0; ret && i < cToBeSigned; i++) {
                 ret = CryptMsgUpdate(msg, rgpbToBeSigned[i], rgcbToBeSigned[i],
                  i == cToBeSigned - 1 ? TRUE : FALSE);
			 }

2) из этого сообщения прекрасно извлекается информация о сертификате типа CERT_INFO
Код:
			 CERT_INFO *certInfo = CRYPT_GetSignerCertInfoFromMsg(msg, dwSignerIndex);
			 if (certInfo!=NULL) {
				char d[100];
				DWORD CStr  = 100;
				CryptBinaryToString (certInfo->SerialNumber.pbData,
									certInfo->SerialNumber.cbData,
									CRYPT_STRING_HEX, d, & CStr);
				printf("\n cert sn = %s \n",d);
			 }

3) безошибочно открываю хранилище сертификатов
Код:
				 HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_MSG,
									pVerifyPara->dwMsgAndCertEncodingType,
									pVerifyPara->hCryptProv, 0, msg);

4) но это хранилище не содержит в себе сертификата! то есть этот код
Код:
					PCCERT_CONTEXT cert = CertFindCertificateInStore(store, pVerifyPara->dwMsgAndCertEncodingType, 0,
												CERT_FIND_SUBJECT_CERT, certInfo, NULL);

и возвращает CRYPT_E_NOT_FOUND

взятие Enumiration сертификатов в этом хранилище тоже не даёт никаких результатов.

в чём может быть проблема?

зы. файлы q.html и q.sign - это данные и подпись под ними.

Отредактировано пользователем 19 мая 2010 г. 15:37:29(UTC)  | Причина: Не указана

Вложение(я):
q.sign (1kb) загружен 11 раз(а).
q.html (2kb) загружен 13 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Илья Муромец  
#2 Оставлено : 19 мая 2010 г. 16:28:51(UTC)
Илья Муромец

Статус: Участник

Группы: Участники
Зарегистрирован: 25.12.2008(UTC)
Сообщений: 25
Откуда: Че

всё, проблему решил.
оказывается, во время подписания надо было указывать в структуре отдельно какие сертификаты включать в подпись
Код:
  SigParams.cMsgCert = 1;
  SigParams.rgpMsgCert = &pSigner;
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.