Не проходит проверка подлинности подписи · issue #243 · diadoc/diadocapi-docs
OCSP или в сертификатах должен быть или задан через настройки.[/quote]
В сертификате указаны OCSP:
Проверяю требования к конфигурации «Создание сообщения с усовершенствованной подписью (CAdES-X Long Type 1)»:
Должна быть доступна запущенная служба актуальных статусов (OCSP-сервер).
Файлики отсюда по ссылкам скачиваются:
[quote]Доступ к информации о центрах сертификации(1.3.6.1.5.5.7.1.1):
[1]Доступ к сведениям центра сертификации
Метод доступа=Поставщик центра сертификации (1.3.6.1.5.5.7.48.2)
Дополнительное имя:
URL=http://cdp.skbkontur.ru/certificates/uc-test-63fz.crt
[2]Доступ к сведениям центра сертификации
Метод доступа=Поставщик центра сертификации (1.3.6.1.5.5.7.48.2)
Дополнительное имя:
URL=http://cdp2.skbkontur.ru/certificates/uc-test-63fz.crt[/quote]
3)»OCSP-сервер должен быть сконфигурирован таким образом, чтобы в поле ThisUpdate OCSP-ответа проставлялось текущее время (например, в режиме работы по БД ЦС для КриптоПро OCSP Server).»
Как я могу это проверить?
«Если соединение с OCSP-сервером осуществляется через прокси-сервер, и этот прокси-сервер отличается от настроенного в Internet Explorer, то его адрес должен быть задан либо в групповых политиках соответствующего клиента, либо передан в качестве аргумента соответствующим функциям КриптоПро ЭЦП SDK.»
Прокси не используется
«Если для соединения с OCSP-сервером требуется аутентификация, то соответствующие параметры должны быть заданы в групповых политиках соответствующего клиента, либо переданы в качестве аргуметов соответствующим функциям КриптоПро ЭЦП SDK.»
Аутентификация нигде не запрашивается
«Адрес OCSP-сервера должен либо содержаться в расширении AIA (Authority Information Access) сертификата, на ключе которого создаётся подпись, либо должен быть задан в групповой политике КриптоПро OCSP Client Адрес службы OCSP по умолчанию, либо его можно указать в свойствах сертификата УЦ, выдавшего данный сертификат. Для этого сертификат УЦ нужно установить в соответствующее хранилище локального компьютера, после чего указать необходимый адрес в свойствах на вкладке «Протокол OCSP».»
Если я правильно понял сертификат и корневой установлены
Сертификат, на котором создаётся подпись и сертификат службы штампов времени, должны проверяться на отзыв и для них должны строиться цепочки.
«Сертификат штампа времни какя могу получить от СКБ Контура по запросу или самостоятельно?»
Полученный от вас установлен
Для сертификата службы актуальных статусов должна строиться цепочка, также он должен иметь расширение Признак доверия службе OCSP (id-pkix-ocsp-nocheck — OID 1.3.6.1.5.5.7.48.1.5).
Схожий адрес в сертификате: Поставщик центра сертификации (1.3.6.1.5.5.7.48.2)
Но он не равен (id-pkix-ocsp-nocheck — OID 1.3.6.1.5.5.7.48.1.5)
[quote]Доступ к информации о центрах сертификации(1.3.6.1.5.5.7.1.1):
[1]Доступ к сведениям центра сертификации
Метод доступа=Поставщик центра сертификации (1.3.6.1.5.5.7.48.2)
Дополнительное имя:
URL=http://cdp.skbkontur.ru/certificates/uc-test-63fz.crt
[2]Доступ к сведениям центра сертификации
Метод доступа=Поставщик центра сертификации (1.3.6.1.5.5.7.48.2)
Дополнительное имя:
URL=http://cdp2.skbkontur.ru/certificates/uc-test-63fz.crt[/quote]
Должена быть установлена лицензия на КриптоПро OCSP Client.
Пример функции обработки кода ошибки (windows)
Все перечисленные описания ошибок доступны в библиотеках tspcli.dll
и ocspcli.dll и могут быть получены программно. Ниже приводится пример
поиска текстового описания произошедшей ошибки по её коду.
BOOL GetErrorMessage( HRESULT hr, LPTSTR szBuf, DWORD chBufLen, DWORD dwLangId) { DWORD dwFacility = HRESULT_FACILITY(hr); HMODULE hInst = 0; switch (dwFacility) { case FACILITY_TSPCLI: { hInst = ::GetModuleHandle(TEXT("tspcli.dll")); } break; case FACILITY_OCSPCLI: { hInst = ::GetModuleHandle(TEXT("ocspcli.dll")); } break; } BOOL dwRet = FALSE; DWORD dwFlagsMod = FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE; if (hInst) { dwRet = FormatMessage(dwFlagsMod, hInst, hr, dwLangId, szBuf, chBufLen, NULL); // Если не нашли сообщение в конкретно заданном языке, // спросим в языке 0 (будет поиск по разным системным языкам) if (!dwRet && dwLangId) dwRet = FormatMessage(dwFlagsMod, hInst, hr, 0, szBuf, chBufLen, NULL); } DWORD dwFlagsSys = FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM; if (!dwRet) { dwRet = FormatMessage(dwFlagsSys, 0, hr, dwLangId, szBuf, chBufLen, NULL); // Если не нашли сообщение в конкретно заданном языке, // спросим в языке 0 (будет поиск по разным системным языкам) if (!dwRet && dwLangId) dwRet = FormatMessage(dwFlagsSys, 0, hr, 0, szBuf, chBufLen, NULL); } return dwRet ? TRUE : FALSE; } //----------------------------------------------- try { // Работа с классами библиотеки // ... } catch( ATL::CAtlException& ex ) { wchar_t buf [1024]; if (GetErrorMessage(ex.m_hr, buf, sizeof(buf), 0)) std::cout << buf << std::endl; SetLastError(static_cast<DWORD>(ex.m_hr)); }