winhttp WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR

winhttp WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR

我正在使用带有 Visual C++ 2015 的 Casablanka Rest SDK。Casablanka SDK 基于 winhttp。每当通过 SSL 发送请求时,都会收到异常。例外情况是:

"SSL error: WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR internal error."

问题仅出现在 Windows 2008 R2 服务器上。我的笔记本电脑 运行 Windows 10 和 Windows 2012 服务器都可以。

从 Windows 2008 浏览启用 SSL 的网站没有问题。但是,我的应用程序无法正常工作,并因上述错误而失败。

感谢任何帮助:)

只需添加 winhttp 跟踪:

"23:24:31.228 ::usr-req 003B2A60 收到 OnTcpConnected 回调 23:24:31.244 :: 异步 I/O 操作完成(重叠 = 00397790,#bytes/info = 0,错误 = SEC_E_INVALID_TOKEN (-2146893048)) 23:24:31.244 ::sys-sender 处理 HttpSendHttpRequest 完成 (error-cdoe = SEC_E_INVALID_TOKEN (0x80090308), #bytes = 0, overlapped = 00397790) 23:24:31.244 ::sys-sender 请求失败;错误 = SEC_E_INVALID_TOKEN (-2146893048) 23:24:31.244 ::ERROR_WINHTTP_FROM_WIN32 映射 (SEC_E_INVALID_TOKEN) -2146893048 到 (ERROR_WINHTTP_SECURE_FAILURE) 12175"

Windows 2008 无法协商 TLS 1.2。因此,我降级了 Rest SDK (cpprestsdk\Release\src\http\client\http_client_winhttp.cpp) 中的协议。

变化:

DWORD secure_protocols = WINHTTP_FLAG_SECURE_PROTOCOL_SSL3 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1;
    if (IsWindowsVersionOrGreater(6, 3, 0)) {
        secure_protocols += WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
    }
    win32_result = ::WinHttpSetOption(m_hSession, WINHTTP_OPTION_SECURE_PROTOCOLS, &secure_protocols, sizeof(secure_protocols));

我希望这对面临同样问题的人有所帮助。