idhttp:SSLv3_READ_BYTES 特定网站上的错误
idhttp: SSLv3_READ_BYTES error on specific sites
我使用 TIdHTTP 来轻松获取请求。大多数情况下它运行良好,但在某些站点上,即使我尝试各种设置也无法建立连接。
我试着按照 here
的回答
To truly connect to "any" server, you would have to detect a "wrong
version" error and retry with a different specific Method/SSLVersions
configuration. Unfortunately, the "wrong version" reply does not
include the server's actual version, so you have to use
trial-and-error. If SSLv23 fails, try TLSv1_2. If that fails, try
TLSv1_1. If that fails, try TLSv1. If that fails, try SSLv3.
但是没有用。
异常 -
'Error connecting with SSL.error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure'
或无法理解的 SSL routines:SSL3_GET_RECORD:wrong 版本号。
但我无法准确解决 SSL3_READ_BYTES:sslv3 alert
重现问题的示例代码和网站示例:
begin
httpSender := TIdHTTP.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SSL.SSLOptions.Method := sslvTLSv1; //or sslvSSLv3, sslvTLSv1,sslvTLSv1_1
//or
//SSL.SSLOptions.Method := sslvSSLv23;
//SSL.SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
httpSender.IOHandler := SSL;
//exceptions here
httpSender.Get('https://www.linux.org/');
//httpSender.Get('https://st.deviantart.net/');
//httpSender.Get('https://c.tcdn.co/fa4/aa2/fa4aa23e-f55b-11e6-ba87-040157cdaf01/channel256.png');
end;
那么我应该如何配置 TIdHTTP 以连接到这些网站?
我使用 Delphi XE8 和 openssl 1.0.1e
您问题中的 None 个站点需要较低的 TLS 协议版本。它们都完全能够与 TLS 1.2 通信,有时甚至可以与 TLS 1.3 通信。但是所有这些站点只有在客户端使用 SNI TLS 扩展在 TLS 握手中通告目标主机名时才能工作。
因此问题更有可能实际上是缺少 SNI 扩展。这似乎是一个已知问题。有关更多信息和处理问题的方法,请参阅 。
我使用 TIdHTTP 来轻松获取请求。大多数情况下它运行良好,但在某些站点上,即使我尝试各种设置也无法建立连接。 我试着按照 here
的回答To truly connect to "any" server, you would have to detect a "wrong version" error and retry with a different specific Method/SSLVersions configuration. Unfortunately, the "wrong version" reply does not include the server's actual version, so you have to use trial-and-error. If SSLv23 fails, try TLSv1_2. If that fails, try TLSv1_1. If that fails, try TLSv1. If that fails, try SSLv3.
但是没有用。
异常 - 'Error connecting with SSL.error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure'
或无法理解的 SSL routines:SSL3_GET_RECORD:wrong 版本号。 但我无法准确解决 SSL3_READ_BYTES:sslv3 alert
重现问题的示例代码和网站示例:
begin
httpSender := TIdHTTP.Create(nil);
SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
SSL.SSLOptions.Method := sslvTLSv1; //or sslvSSLv3, sslvTLSv1,sslvTLSv1_1
//or
//SSL.SSLOptions.Method := sslvSSLv23;
//SSL.SSLOptions.SSLVersions := [sslvSSLv2, sslvSSLv3, sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
httpSender.IOHandler := SSL;
//exceptions here
httpSender.Get('https://www.linux.org/');
//httpSender.Get('https://st.deviantart.net/');
//httpSender.Get('https://c.tcdn.co/fa4/aa2/fa4aa23e-f55b-11e6-ba87-040157cdaf01/channel256.png');
end;
那么我应该如何配置 TIdHTTP 以连接到这些网站?
我使用 Delphi XE8 和 openssl 1.0.1e
None 个站点需要较低的 TLS 协议版本。它们都完全能够与 TLS 1.2 通信,有时甚至可以与 TLS 1.3 通信。但是所有这些站点只有在客户端使用 SNI TLS 扩展在 TLS 握手中通告目标主机名时才能工作。
因此问题更有可能实际上是缺少 SNI 扩展。这似乎是一个已知问题。有关更多信息和处理问题的方法,请参阅