2015-04-22 2 views
5

Недавно Amazon отключил поддержку SSL для S3-ковшей, и, похоже, это вызывает проблемы с Windows XP SP3. Я использую этот кодWinHttp не загружается с Amazon S3 на 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); 

Это работает на 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] 

Есть ли способ решить эту проблему без использования 3-библиотек? (браузеры, включая IE, загружают файлы без проблем).

ответ

1

У меня такая же проблема. Я думаю, что это может быть вызвано проблемой шифрования SSL_RSA_WITH_3DES_EDE_SHA, выбранной в WinHTTP на XP. Попробуйте это как тест: На машине XP, добавить новое значение DWORD под названием «Включено» для ключа:

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

Это отключает, что шифр и, кажется, исправить эту проблему для меня. Однако это не идеальное решение, и я все еще не уверен в основной проблеме. Возможно, проблема с любым криптовым провайдером Amazon?

+0

, значение DWORD должно быть 0, правильно? :) – Sergi0

+0

Я принимаю ваше решение на данный момент, оно исправляет проблему, но я не уверен, что отключить протоколы на ПК конечного пользователя - это хорошая идея :) может быть, позже кто-то предложит лучший способ или объяснит основную проблему , – Sergi0

+0

Да, 0! Извините за упущение. Я согласен с тем, что это не приемлемое решение, я все еще пытаюсь выяснить, что именно вызывает этот шифр, чтобы свести квитирование соединения. –

-1

Предполагая, что вы держите свою небезопасную dwFlags, вы можете отключить HTTPS.
Вы полностью игнорируете любые ошибки SSL и допускаете много атак и манипулирования содержимым.

Итак, если вы не заботитесь о безопасности, зачем использовать HTTPS?

Только Sidenote:
вы должны заботиться о безопасности и удалить эти опасные флаги.

+0

ОК, я удаляю эти флаги, код по-прежнему не работает при победе 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 на своем конце. –