Коды ошибок из библиотек tspcli.dll и ocspcli.dll

Не проходит проверка подлинности подписи · 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));
    }
    
    

    Оцените статью
    ЭЦП64
    Добавить комментарий