2015-04-22 86 views
5

最近亞馬遜已禁用S3桶的SSL支持,它似乎在Win XP SP3上導致問題。 我使用此代碼WinHttp不從WinXP上的Amazon S3下載

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:服務器返回無效或無法識別的響應。我已經啓用跟蹤和記錄FIEL有不同的錯誤:

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,下載文件沒有問題)。

回答

1

我遇到同樣的問題。我認爲這可能是由在XP上的WinHTTP中選擇的SSL_RSA_WITH_3DES_EDE_SHA密碼導致的。試試這個作爲測試: 在XP的機器,添加一個新的名爲DWORD值「已啓用」,以重點:

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

這禁用密碼,似乎解決這個問題對我來說。然而,這不是一個理想的解決方案,我仍然不確定潛在的問題。亞馬遜正在使用的加密提供商可能存在問題?

+0

DWORD值應該是0,對嗎? :) – Sergi0

+0

我現在接受你的解決方案,它確實解決了這個問題,但我不確定禁用最終用戶PC上的協議是個好主意:)也許後來有人提出更好的方法或解釋底層問題。 – Sergi0

+0

是的,0!遺憾的是遺憾。我同意這不是一個可行的解決方案,我仍然試圖找出究竟是什麼導致密碼使連接握手失敗。 –

-1

假設你保持不安全dwFlags你可以關閉HTTPS。
你總是忽略任何SSL錯誤,並允許大量的攻擊和內容操縱。

所以,如果你不關心安全性爲什麼使用HTTPS?

只是一個旁註:
你應該關心的安全和消除這些不安全的標誌。

+0

好的,我刪除了這些標誌,代碼仍然不能在win XP上運行。讓我們聽聽一些安全提示。 – Sergi0

0

我能夠重做代碼並使用WinInet工作正常。

hInternet = InternetOpen("myapp", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); 
hConnect = InternetConnect(hInternet, server, port, NULL, NULL, INTERNET_SERVICE_HTTP, 0, NULL); 

const char *accept_types[] = { "*/*", NULL }; 
DWORD flags = INTERNET_FLAG_NO_UI | INTERNET_FLAG_SECURE; 

hRequest = HttpOpenRequest(hConnect, verb, addr, NULL, NULL, accept_types, flags, NULL); 
bResults = HttpSendRequest(hRequest, headers, -1, data, size); 

bResults = HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE, tmp_buf, &buf_sz, NULL); 
// check for 200 here... 

bResults = HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH, tmp_buf, &buf_sz, NULL); 
// allocate a buffer here 

INTERNET_BUFFERS buf = { sizeof(INTERNET_BUFFERS) }; 
buf.lpvBuffer = &buffer[0]; 
buf.dwBufferTotal = content_length; 

// read using InternetReadFileEx or InternetReadFile 

代碼沒有明確的TLS聲明,但如果服務器只支持TLS客戶端將不會有任何的選擇。

+0

我發現只有WinHTTP發生這種情況 - 而不是WinInet。 IE 8(安裝在XP機器上)也可以正常工作,但我認爲它在後端使用WinInet。 –