我使用 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.
但这并没有帮助。
异常 - '与 SSL 连接时出错。错误:14094410:SSL 例程:SSL3_READ_BYTES:sslv3 警报握手失败'
或者无法理解的 SSL 例程:SSL3_GET_RECORD:错误的版本号。 但我无法准确解决 SSL3_READ_BYTES:sslv3 警报
重现问题的示例代码和网站示例:
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
最佳答案
您问题中的所有站点都不需要较低的 TLS 协议(protocol)版本。它们都完全能够与 TLS 1.2 通信,有时甚至可以与 TLS 1.3 通信。但是所有这些站点只有在客户端使用 SNI TLS 扩展在 TLS 握手中通告目标主机名时才能工作。
因此,问题更有可能实际上是缺少 SNI 扩展。这似乎是一个已知问题。参见 TIdHTTP and TLS SNI doesnt work了解更多信息和解决问题的方法。
关于delphi - idhttp:特定站点上的 SSLv3_READ_BYTES 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52664257/