"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 была бы полезна (для эксперта, а не для меня).