" 1408F10B:SSL例程:SSL3_GET_RECORD:错误的版本号调用:"在Indy

时间:2015-04-14 12:59:16

标签: delphi google-analytics openssl indy

我有一个网络应用程序,经常 TIdHTTP 调用Google AnalyticsAPI(每天大约25,000-50,000)。每隔一段时间调用API就会失败并显示主题行中的错误消息(通常不会超过1000次中的1次)。我从来没有找到一种模式来实现它。并且重试失败的呼叫通常有效。所以它似乎完全是随机的。

我有最新版本的openssl(1.0.2.1 - 03/20/2015)。最新版本的Indy(源代码文件日期为2015年7月1日)。

以下是进行这些调用的基本源代码。

任何人都有任何想法可能是什么?

对API进行两次同时调用是否会影响事情(这是在多线程Web应用程序中进行的)?

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 个答案:

答案 0 :(得分:5)

  

通过更改此问题解决了问题:

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,则必须禁用压缩。这个奇怪的事实出现在ECDHE-ECDSA Support下的OpenSSL邮件列表的讨论中。以下是它生成的相关支持服务单:Bug 3277: OpenSSL s_client doc missing option

其次,如果您没有使用ChaCha20 / Poly1305密码,那么您必须注意TLS 1.2的后备密码套件。我从来没有能够解决这个问题(特别是因为应该支持所有短暂的DH套件),但我知道使用是测试的情况。因此,请务必在回退时包含以下内容(对于运行IIS 8(或可能是7)及更早版本的Microsoft服务器,也需要这样做):

  • 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

答案 1 :(得分:2)

通过更改此问题解决了问题:

SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];

对此:

SSLOptions.Method := sslvSSLv3;
SSLOptions.SSLVersions := [sslvSSLv3];

令人惊讶的是,大多数服务都转向TLS。

答案 2 :(得分:0)

我怀疑Google仍允许使用SSLv3访问其服务器(请参阅Poodle攻击)。

  

POODLE攻击(代表“Padding Oracle On Downgraded   Legacy Encryption“)是一种中间人的攻击   互联网和安全软件客户端回退SSL的优势   3.0。

因此,如果您的客户端收到与SSLv3相关的错误消息,我会联系网络专家,以检查此错误消息是否可能是由中间人攻击造成的。

它也可能是一个简单的网络问题,因为它不可重复。

为了更深入的诊断,Wireshark录音会有所帮助(对于专家,而不是我)。