"1408F10B: SSL процедуры: SSL3 получить запись:неправильный номер версии вызов:" на Indy
у меня есть веб-приложение, которое часто TIdHTTP звонки в API Google Analytics (около 25,000-50,000 в день). Время от времени вызовы API завершаются ошибкой с сообщением об ошибке в строке темы (не часто - менее 1 из 1000 раз). Я никогда не мог найти образец, чтобы это произошло. И повторная попытка неудачного вызова обычно работает. Так что это кажется совершенно случайным.
у меня есть последняя версия openssl (1.0.2.1 - 03/20/2015). И последнее версия Indy (файлы исходного кода от 01/07/2015).
Ниже приведен основной исходный код для выполнения этих вызовов.
кто-нибудь есть идеи, что это может быть?
повлияет ли два одновременных вызова API на вещи (это происходит в многопоточном веб-приложении)?
IdSSLIOHandlerSocket1 := TIdSSLIOHandlerSocketOpenSSL.create(nil);
IdSSLIOHandlerSocket1.PassThrough := True;
IdHTTP := TIdHTTP.create(nil);
IdHTTP.reusesocket := rsTrue;
IdSSLIOHandlerSocket1.reusesocket := rsTrue;
idhttp.handleredirects := True;
with IdSSLIOHandlerSocket1 do begin
SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];
SSLOptions.VerifyMode := [];
SSLOptions.VerifyDepth := 2;
end;
with IdHTTP do begin
IOHandler := IdSSLIOHandlerSocket1;
ProxyParams.BasicAuthentication := False;
Request.UserAgent := 'EmbeddedAnalytics API Interface';
Request.ContentType := 'text/html';
request.connection := 'close';
Request.Accept := 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Request.BasicAuthentication := False;
Request.UserAgent := 'Mozilla/3.0 (compatible; Indy Library)';
HTTPOptions := [hoForceEncodeParams];
Request.AcceptEncoding := 'gzip,deflate';
Request.CustomHeaders.Add('Accept-Language: en-us,en;q=0.5');
idhttp.Request.CustomHeaders.Add('Authorization: Bearer '+FToken);
end;
idhttp.get(':https://www.googleapis.com/analytics/v3/data/realtime?ids=..........');
обновление 1 обновить несколько строк кода:
SSLOptions.Method := sslvSSLv3;
SSLOptions.SSLVersions := [sslvSSLv3];
это работает. Я буду отслеживать и видеть, идут ли ошибки SSL прочь.
решение оказывается, внесение изменений в sslVSSLv3 исправлено. Я больше не получаю ошибок! Это несколько удивительно, видя, что большинство других служб принимают TLS вместо этого.
3 ответов
проблема решена путем изменения этого:
SSLOptions.Method := sslvTLSv1_2; SSLOptions.SSLVersions := [sslvTLSv1_2];
для этого:
SSLOptions.Method := sslvSSLv3; SSLOptions.SSLVersions := [sslvSSLv3];
вы можете попробовать TLS 1.0 вместо этого, чтобы избежать SSLv3.
есть две вещи, которые следует помнить с Google и TLS 1.2. И кое-что из этого, возможно, уже изменилось. (Это обсуждение очень специфично, и оно применяется только к серверам Google и TLS 1.2).
во-первых, вы должны отключить сжатие при использовании TLS 1.2 и ECDSA. Этот странный факт появился в обсуждении списка рассылки OpenSSL в разделе поддержка ECDHE-ECDSA. Вот связанный билет поддержки, который он создал:ошибка 3277: OpenSSL s_client doc отсутствует опция.
во-вторых, если вы не используете шифры ChaCha20/Poly1305, то вы должны помнить о резервных наборах шифров для TLS 1.2. Я никогда не мог понять это (тем более, что все эфемерные люксы DH должны поддерживаться), но я знаю это используется в случае тестирования. Поэтому обязательно включите следующее для резервного копирования (это также необходимо для серверов Microsoft под управлением IIS 8 (или, возможно, 7) и ранее):
- TLS_RSA_WITH_AES_256_CBC_SHA256
- TLS_RSA_WITH_AES_256_CBC_SHA
- TLS_RSA_WITH_AES_128_CBC_SHA256
- TLS_RSA_WITH_AES_128_CBC_SHA
проблема решена путем изменения этого:
SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];
для этого:
SSLOptions.Method := sslvSSLv3;
SSLOptions.SSLVersions := [sslvSSLv3];
Это удивительно, видя, что большинство служб вместо этого переходят на TLS.
Я сомневаюсь, что Google по-прежнему разрешает доступ к своим серверам с помощью SSLv3 (см. пудель атака).
атака пуделя (что означает " заполнение Oracle на пониженном уровне Legacy Encryption")-это эксплойт "человек в середине", который принимает преимущество интернет-и безопасности программного обеспечения клиентов резервного SSL 3.0.
поэтому, если ваш клиент получает сообщение об ошибке SSLv3, я бы связался с сетевым экспертом, чтобы проверить, если это сообщение об ошибке может быть вызвано атакой "человек в середине".
Это также может быть простой сетевой проблемой, поскольку она не воспроизводима.
для более глубокого диагноза запись Wireshark была бы полезна (для эксперта, а не для меня).