2015-04-22 15 views
5

Gần đây, Amazon đã tắt hỗ trợ SSL cho nhóm S3 và có vẻ như nó gây ra sự cố trên Win XP SP3. tôi sử dụng mã nàyWinHttp không tải xuống từ Amazon S3 trên WinXP

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); 

này hoạt động trên Win7 và làm việc một tháng hoặc lâu hơn trước trên WinXP. Nhưng bây giờ tôi nhận được lỗi WinHttp 12152: Máy chủ trả về phản hồi không hợp lệ hoặc không được công nhận. Tôi đã bật dò tìm và đăng nhập fiel có một lỗi khác:

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] 

Có cách nào để khắc phục vấn đề này mà không sử dụng thư viện của bên thứ ba không? (trình duyệt, bao gồm IE, tải xuống tệp mà không gặp sự cố).

Trả lời

1

Tôi đang gặp vấn đề tương tự. Tôi nghĩ rằng nó có thể được gây ra bởi một vấn đề với mật mã SSL_RSA_WITH_3DES_EDE_SHA được chọn trong WinHTTP trên XP. Hãy thử điều này như một thử nghiệm: Trên máy XP, thêm một giá trị DWORD mới có tên gọi "Enabled" để chìa khóa:

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

này vô hiệu hóa mà mật mã và dường như khắc phục vấn đề đối với tôi. Đây không phải là một giải pháp lý tưởng tuy nhiên, và tôi vẫn không chắc chắn về vấn đề cơ bản. Có lẽ một vấn đề với bất kỳ nhà cung cấp mật mã Amazon đang sử dụng?

+0

giá trị DWORD phải là 0, phải không? :) – Sergi0

+0

Tôi đang chấp nhận giải pháp của bạn bây giờ, nó khắc phục được sự cố, nhưng tôi không chắc chắn rằng vô hiệu hóa các giao thức trên máy tính người dùng cuối là một ý tưởng hay :) có thể sau đó ai đó đề xuất một cách tốt hơn hoặc giải thích vấn đề cơ bản . – Sergi0

+0

Có, 0! Xin lỗi về sự thiếu sót. Tôi đồng ý rằng đây không phải là giải pháp khả thi, tôi vẫn đang cố gắng tìm ra chính xác những gì khiến mật mã đó làm cho việc kết nối bắt tay thất bại. –

-1

Giả sử bạn giữ an toàn không an toàn dwFlags, bạn có thể tắt HTTPS.
Bạn đang totaly bỏ qua bất kỳ lỗi SSL nào và cho phép nhiều cuộc tấn công và thao tác nội dung.

Vì vậy, nếu bạn không quan tâm đến bảo mật tại sao sử dụng HTTPS?

Chỉ cần một phụ trang:
bạn nên quan tâm đến bảo mật và xóa các cờ không an toàn này.

+0

ok, tôi xóa những lá cờ đó, mã vẫn không hoạt động trên win XP. chúng ta hãy nghe một số gợi ý an toàn. – Sergi0

0

Tôi đã có thể làm lại mã và sử dụng WinInet hoạt động tốt.

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 

mã không có khai báo TLS rõ ràng, nhưng nếu máy chủ chỉ hỗ trợ TLS, máy khách sẽ không có bất kỳ lựa chọn nào.

+0

Tôi thấy điều này xảy ra chỉ với WinHTTP - không phải WinInet. IE 8 (được cài đặt trên máy XP) cũng hoạt động tốt, nhưng tôi nghĩ nó sử dụng WinInet ở mặt sau của nó. –

Các vấn đề liên quan