Indy 上的“1408F10B:SSL routines:SSL3_GET_RECORD:wrong 版本号调用:”
"1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number call:" on Indy
我有一个 Web 应用程序,它经常 TIdHTTP 调用 Google Analytics API(每天大约 25,000-50,000 次)。每隔一段时间调用 API 就会失败,并在主题行中显示错误消息(不经常 - 不到 1000 次中的 1 次)。我一直无法找到一种模式来实现它。重试失败的呼叫通常有效。所以它看起来完全是随机的。
我有最新版本的 openssl (1.0.2.1 - 03/20/2015)。以及最新版本的 Indy(源代码文件日期为 01/07/2015)。
下面是进行这些调用的基本源代码。
有人知道它可能是什么吗?
同时调用 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,这有点令人惊讶。
我怀疑 Google 仍然允许使用 SSLv3 访问他们的服务器(参见 Poodle 攻击)。
The POODLE attack (which stands for "Padding Oracle On Downgraded
Legacy Encryption") is a man-in-the-middle exploit which takes
advantage of Internet and security software clients' fallback to SSL
3.0.
因此,如果您的客户端收到与 SSLv3 相关的错误消息,我会联系网络专家来检查此错误消息是否是由中间人攻击引起的。
它也可能是一个简单的网络问题,因为它不可重现。
要进行更深入的诊断,Wireshark 记录会有所帮助(对专家而言,不是我)。
通过更改此解决问题:
SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];
为此:
SSLOptions.Method := sslvSSLv3;
SSLOptions.SSLVersions := [sslvSSLv3];
令人惊讶的是,大多数服务都转向了 TLS。
Problem solved by changing this:
SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];
To this:
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. Here's a related support ticket it generated: Bug 3277: OpenSSL s_client doc missing option.
下的 OpenSSL 邮件列表的讨论中
其次,如果您没有使用 ChaCha20/Poly1305 密码,那么您必须注意 TLS 1.2 的后备密码套件。我一直无法弄清楚这一点(特别是因为应该支持所有短暂的 DH 套件),但我知道 used 是测试的情况。因此,请务必包括以下内容以备后用(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
我有一个 Web 应用程序,它经常 TIdHTTP 调用 Google Analytics API(每天大约 25,000-50,000 次)。每隔一段时间调用 API 就会失败,并在主题行中显示错误消息(不经常 - 不到 1000 次中的 1 次)。我一直无法找到一种模式来实现它。重试失败的呼叫通常有效。所以它看起来完全是随机的。
我有最新版本的 openssl (1.0.2.1 - 03/20/2015)。以及最新版本的 Indy(源代码文件日期为 01/07/2015)。
下面是进行这些调用的基本源代码。
有人知道它可能是什么吗?
同时调用 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,这有点令人惊讶。
我怀疑 Google 仍然允许使用 SSLv3 访问他们的服务器(参见 Poodle 攻击)。
The POODLE attack (which stands for "Padding Oracle On Downgraded Legacy Encryption") is a man-in-the-middle exploit which takes advantage of Internet and security software clients' fallback to SSL 3.0.
因此,如果您的客户端收到与 SSLv3 相关的错误消息,我会联系网络专家来检查此错误消息是否是由中间人攻击引起的。
它也可能是一个简单的网络问题,因为它不可重现。
要进行更深入的诊断,Wireshark 记录会有所帮助(对专家而言,不是我)。
通过更改此解决问题:
SSLOptions.Method := sslvTLSv1_2;
SSLOptions.SSLVersions := [sslvTLSv1_2];
为此:
SSLOptions.Method := sslvSSLv3;
SSLOptions.SSLVersions := [sslvSSLv3];
令人惊讶的是,大多数服务都转向了 TLS。
Problem solved by changing this:
SSLOptions.Method := sslvTLSv1_2; SSLOptions.SSLVersions := [sslvTLSv1_2];
To this:
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. Here's a related support ticket it generated: Bug 3277: OpenSSL s_client doc missing option.
下的 OpenSSL 邮件列表的讨论中其次,如果您没有使用 ChaCha20/Poly1305 密码,那么您必须注意 TLS 1.2 的后备密码套件。我一直无法弄清楚这一点(特别是因为应该支持所有短暂的 DH 套件),但我知道 used 是测试的情况。因此,请务必包括以下内容以备后用(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