我已经在这个问题上b了几个星期。我知道这不是我的代码,因为相同的代码在Win10笔记本电脑上可以正常工作,但在Win7上始终会失败。
hSess = WinHttpOpen(NULL, WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, NULL);
if (hSess)
hConn = WinHttpConnect(hSess, web_server, (ssl == true ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT), NULL);
else
retcode = -1;
if (hConn)
hReq = WinHttpOpenRequest(hConn, NULL, object, NULL, WINHTTP_NO_REFERER, accepted_types, (ssl == true ? WINHTTP_FLAG_SECURE : NULL));
else
retcode = -1;
DWORD sec = WINHTTP_FLAG_SECURE_PROTOCOL_ALL | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_1 | WINHTTP_FLAG_SECURE_PROTOCOL_TLS1_2;
WinHttpSetOption(hReq, WINHTTP_OPTION_SECURE_PROTOCOLS, &sec, sizeof(sec));
WinHttpSetStatusCallback(hReq, _WinhttpStatusCallback, WINHTTP_CALLBACK_FLAG_SECURE_FAILURE, NULL);
if (hReq)
res = WinHttpSendRequest(hReq, WINHTTP_NO_ADDITIONAL_HEADERS, NULL, WINHTTP_NO_REQUEST_DATA, NULL, NULL, NULL);
else
retcode = -1;
上面的代码在WinHttpSendRequest调用上失败。 GetLastError返回的标志是ERROR_WINHTTP_SECURE_FAILURE,而WinHttpStatusCallback状态信息标志是WINHTTP_CALLBACK_STATUS_FLAG_SECURITY_CHANNEL_ERROR。
我已经检查了TLS和SSL的注册表设置,并且所有设置都是正确的。我还运行了Win7的更新(位于https://support.microsoft.com/en-au/help/3140245/update-to-enable-tls-1-1-and-tls-1-2-as-default-secure-protocols-in-wi),但无济于事。
我还尝试通过在标志中使用INTERNET_DEFAULT_HTTP_PORT而不是HTTPS来禁用SSL,以进行WinHttpConnect调用,但也没有成功。
但是,如果我在浏览器中转到要连接的URL,则该URL可以通过https连接而没有问题。
有什么想法吗?