【问题标题】:Can't open Https TSL page with Delphi - Indy Error : SSL23_GET_SERVER_HELLO无法使用 Delphi 打开 Https TSL 页面 - Indy 错误:SSL23_GET_SERVER_HELLO
【发布时间】:2018-01-25 18:54:37
【问题描述】:

我想在 Delphi XE5 中使用 Indy 的 TIdHTTP 通过 HTTPS 读取 HTML 页面。

ssleay32.dlllibeay32.dll 位于主程序文件夹中。

我收到一个错误:SSL23_GET_SERVER_HELLO。我能做些什么来解决这个问题?

function get_page_text:string;
var
  Response: String;
  HTTPClient: TidHTTP;
const
  url = 'https://www.lustundreiz.com/login';
begin
  HTTPClient := TidHTTP.Create;
  HTTPClient.AllowCookies := True;
  HTTPClient.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  Response := HTTPClient.get(url);
  HTTPClient.Free;
  result := response;
end;

【问题讨论】:

    标签: delphi ssl https indy delphi-xe5


    【解决方案1】:

    TIdSSLIOHandlerSocketOpenSSL 在您未指定版本时使用的默认 SSL/TLS 版本是 TLSv1,而不是 SSLv23。因此,您遇到 SSL23 错误是非常罕见的。

    许多现代 Web 服务器现在需要 TLS 1.1 或更高版本,以及 SNI 等 TLS 扩展。因此,除了默认的 sslvTLSv1 之外,还可以考虑在 TIdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions 属性中启用 sslvTLSv1_1sslvTLSv1_2。并确保您使用的是最新版本的 Indy 和 OpenSSL DLL 来支持这些版本。

    您还应该将代码包装在try..finally 中,这样即使Get() 引发异常,您也可以Free TIdHTTP 对象。

    试试这个:

    function get_page_text:string;
    var
      HTTPClient: TIdHTTP;
      SSL: TIdSSLIOHandlerSocketOpenSSL;
    const
      url = 'https://www.lustundreiz.com/login';
    begin
      HTTPClient := TIdHTTP.Create;
      try
        HTTPClient.AllowCookies := True;
        // set other HTTP properties as needed...
    
        SSL := TIdSSLIOHandlerSocketOpenSSL.Create(HTTPClient);
        SSL.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
        // set other SSL properties as needed...
        HTTPClient.IOHandler := SSL;
    
        Result := HTTPClient.Get(url);
      finally
        HTTPClient.Free;
      end;
    end;
    

    【讨论】:

    • 感谢您的快速响应,但如果我将您的代码复制到我的 IDE 中,则会出现错误 Line : TIdSSLIOHandlerSocketOpenSSL(HTTPClient.IOHandler).SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];错误:SSLVersions -> 未知
    • @Ingo:对不起,我的错字。我修好了。
    • 是的,谢谢您的代码更新。但是如果我运行你的代码,我会得到同样的错误。 SSL23_GET_SERVER_HELLO:sslv3 警报 hanschake 失败
    • 完整的错误代码是:错误。 14077410:SSL 例程:SSL23_GET_SERVER_HELLO:sslv3 警报 hanschake 失败
    • @Ingo:使用最新版本的 Indy 和 OpenSSL,我显示的代码对我来说工作正常,您提供的 URL 没有 SSL 错误,我收到的是 HTML。如果您使用的是 XE5 附带的 Indy 版本,您应该升级您的 Indy 版本
    【解决方案2】:

    好的,在我从 Delphi XE5 更新到 Delphi XE10 后,代码运行良好,没有任何错误。 感谢雷米的支持。

    【讨论】:

      猜你喜欢
      • 2022-10-05
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多