簡體   English   中英

WinHttpSetOption() 設置 TLSv1.2 失敗,錯誤代碼為 ERROR_INTERNET_INCORRECT_HANDLE_TYPE

[英]WinHttpSetOption() failed set TLSv1.2 with error code ERROR_INTERNET_INCORRECT_HANDLE_TYPE

我正在嘗試使用前面提到的cpprest API 調用從 C++ (Win) 代碼設置TLSv1.1 or v1.2 但是WinHttpSetOption()失敗並出現錯誤ERROR_INTERNET_INCORRECT_HANDLE_TYPE (12018)。

操作系統:Windows(7/8)

  1. 嘗試從注冊表設置中設置 TLSv1.1 和 TLS1.2 無效。
  2. 嘗試獲取 OpenSLL,但 windows 無法使用 opensll1.0.1(支持 TLS1.1 及更高版本)。
  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);

請幫助我使用 C++ REST API 設置 TLSv1.1 或 v1.2。 或者如何使WinHttpSetOption()成功。

使用 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.

請嘗試安裝此更新:

https://support.microsoft.com/en-gb/topic/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-winhttp-in- windows-c4bd73d2-31d7-761e-0178-11268bb10392

“此更新為 Windows Server 2012、Windows 7 Service Pack 1 (SP1) 和 Windows Server 2008 R2 SP1 中的傳輸層安全性 (TLS) 1.1 和 TLS 1.2 提供支持。”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM