最近,Amazon禁用了对S3存储桶的SSL支持,这似乎在Win XP SP3上引起了问题。
我用这个代码

hSession = WinHttpOpen(L"MySession",
                    WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
                    WINHTTP_NO_PROXY_NAME,
                    WINHTTP_NO_PROXY_BYPASS, 0);


if (bHTTPS)
{
  DWORD flags = WINHTTP_FLAG_SECURE_PROTOCOL_TLS1;
  WinHttpSetOption(hSession, WINHTTP_OPTION_SECURE_PROTOCOLS, &flags, sizeof(flags));
}

port = bHTTPS ? INTERNET_DEFAULT_HTTPS_PORT : INTERNET_DEFAULT_HTTP_PORT;
hConnect = WinHttpConnect(hSession, srv_w, port, 0);
hRequest = WinHttpOpenRequest(hConnect, vrb_w, adr_w, NULL, WINHTTP_NO_REFERER, NULL,  WINHTTP_FLAG_REFRESH | (bHTTPS ? WINHTTP_FLAG_SECURE : 0));

if (bHTTPS)
{
  DWORD dwSecFlag = SECURITY_FLAG_IGNORE_CERT_CN_INVALID |
                        SECURITY_FLAG_IGNORE_CERT_DATE_INVALID |
                        SECURITY_FLAG_IGNORE_UNKNOWN_CA |
                        SECURITY_FLAG_IGNORE_CERT_WRONG_USAGE;

  WinHttpSetOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwSecFlag, sizeof(dwSecFlag));
}

WinHttpSendRequest(hRequest, hdr_w, (headers != NULL) ? -1 : 0, data, size, size, 0);
WinHttpReceiveResponse(hRequest, NULL);

这在Win7上有效,并在一个月左右的WinXP上起作用。但是现在我收到WinHttp错误12152:服务器返回了无效或无法识别的响应。我启用了跟踪,日志文件有一个不同的错误:
17:47:47.057 ::*0000001* :: WinHttpSendRequest(0x10a0000, "", 0, 0x0, 0, 0, 0)
17:47:47.135 ::*0000001* :: "s3.amazonaws.com" resolved
17:47:47.307 ::*0000001* :: Winsock/RPC/SSL/Transport error: 0x90312 [SEC_I_CONTINUE_NEEDED]

有没有不使用第三方库就可以解决此问题的方法? (包括IE在内的浏览器可以毫无问题地下载文件)。

最佳答案

我有同样的问题。我认为这可能是由XP上的WinHTTP中选择的SSL_RSA_WITH_3DES_EDE_SHA密码问题引起的。试试这个作为测试:
在XP计算机上,将一个名为“Enabled”的新DWORD值添加到 key :

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Ciphers\Triple DES 168/168

这会禁用该密码,似乎可以解决我的问题。但是,这不是理想的解决方案,我仍然不确定潜在的问题。也许亚马逊正在使用的任何加密提供商都存在问题?

关于visual-c++ - WinHttp 无法从 WinXP 上的 Amazon S3 下载,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29801450/

10-11 04:05