WinHttpSetOption () не удалось установить TLSv1.2 с кодом ошибки ERROR_INTERNET_INCORRECT_HANDLE_TYPE - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь установить TLSv1.1 or v1.2 из кода C ++ (Win), используя cpprest вызовы API, как уже упоминалось.Но WinHttpSetOption() завершается с ошибкой ERROR_INTERNET_INCORRECT_HANDLE_TYPE (12018).

ОС: Windows (7/8)

  1. Пытался установить TLSv1.1 и TLS1.2 из реестранастройка не сработала.
  2. Попытка получить OpenSLL, но opensll1.0.1 (который поддерживает TLS1.1 и более) недоступна для Windows.
  3. Попытка получить другой, чем собственный дескриптор, не найденаAPI
auto func = [&](web::http::client::native_handle handle){
    BOOL win32Result{ FALSE };
    DWORD secure_protocols{ WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1
        | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2 };
    win32Result = ::WinHttpSetOption(handle,
        WINHTTP_OPTION_SECURE_PROTOCOLS,
        &secure_protocols,
        sizeof(secure_protocols));
    if (FALSE == win32Result) {
        std::cout << "Can not set TLS 1.1 or TLS 1.2." << std::endl;
        auto err = GetLastError();
        CString cstr;
        cstr.Format(_T("err = %d"),err);
        AfxMessageBox(cstr);
    }
};
config.set_validate_certificates(false);
config.set_nativehandle_options(func);

Пожалуйста, помогите мне установить TLSv1.1 или v1.2 с помощью C ++ REST API.Или как сделать WinHttpSetOption() успешным.

1 Ответ

0 голосов
/ 16 февраля 2019

Используя WinHttpOpen, мы можем получить «дескриптор сеанса», который можно передать в WinHttpSetOption ().Это устраняет ошибку «ERROR_INTERNET_INCORRECT_HANDLE_TYPE».

HINTERNET hSession = WinHttpOpen(L"<Application name>",
    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
    WINHTTP_NO_PROXY_NAME,
    WINHTTP_NO_PROXY_BYPASS, 0);

Хотя я устанавливаю версию TLS 1.2 / 1.1.Тем не менее мой «http_request» использует TLSv1.0, который по умолчанию используется в Windows 7 / 8.1. (Это можно подтвердить с помощью wireshark)

Может кто-нибудь сообщить мне, почему «http_request» все еще использует TLS1.0.

...