【问题标题】:Delphi EIdOSSLUnderlyingCryptoError Exception - SSL3_GET_RECORD Wrong Version NumberDelphi EIdOSSLUnderlyingCryptoError 异常 - SSL3_GET_RECORD 错误的版本号
【发布时间】:2023-03-17 08:51:01
【问题描述】:

我尝试使用TRESTClient 连接到使用 TLS 1.2 的 HTTPS Web 服务。但是发送multipart/form-data 没有运气。

所以现在我正在尝试使用 Indy。我收到了这个“错误的版本号”错误。

我认为代码没有任何问题,因为它与 HTTP 一起使用。

可能我的 Delphi 缺少一些东西。我应该安装什么以及如何安装?

procedure TForm10.Button2Click(Sender: TObject);
var
  HTTP: TIdHTTP;
  RequestBody: TStream;
  ResponseBody: string;
  myssl: TIdSSLIOHandlerSocketOpenSSL;
  Input: TIdMultipartFormDataStream;
begin
  ResponseBody := '';
  try
    try
      HTTP := TIdHTTP.Create;
      try
        Input := TIdMultipartFormDataStream.Create;
        try
          Input.Clear;
          Input.AddFormField('Email', 'xx@xx.com.tr');
          Input.AddFormField('Password', 'xx');

          myssl := TIdSSLIOHandlerSocketOpenSSL.Create(HTTP);
          HTTP.IOHandler := myssl;
          myssl.SSLOptions.Mode := sslmUnassigned;
          myssl.SSLOptions.Method := sslvTLSv1_2;
          myssl.SSLOptions.SSLVersions := [sslvTLSv1_2];
          HTTP.HTTPOptions := [hoForceEncodeParams];

          HTTP.Request.CustomHeaders.FoldLines := False;
          ResponseBody := HTTP.Post('https://xxx.com.tr/api/Mobile/MobileLoginControl', Input);

        finally
          Input.Free;
        end;
      finally
        HTTP.Free;
      end;
    finally
    end;
  except
    ResponseBody := '"-20"';
  end;
end;

【问题讨论】:

    标签: delphi multipartform-data firemonkey tls1.2 indy


    【解决方案1】:

    代码很好,尽管您在SSLIOHandler 上启用 TLS 1.2。也许有问题的网站不支持 TLS 1.2?尝试同时启用 TLS 1.0 和 1.1:

    myssl.SSLOptions.SSLVersions := [sslvTLSv1, sslvTLSv1_1, sslvTLSv1_2];
    

    并且根本不要设置SSLOptions.Method。设置SSLVersions 会更新Method,反之亦然。所以设置一个或另一个,而不是两个。

    【讨论】:

    • 现在试过了。我收到“ssl23_get_server_hello 未知协议”错误。我什至将端口放在我的 url 地址中,例如“xxx.com.tr:443”,结果是一样的。
    • “未知协议”通常意味着 OpenSSL 接收到的东西不是有效的服务器握手。例如,如果您尝试在未使用 SSL/TLS 的端口上协商 SSL/TLS 握手。您是否尝试过嗅探网络流量以查看服务器实际发送的内容?
    • 实际上我使用了一个网站来仔细检查服务器正在使用什么。它使用的是 TLS1_2,仅此而已。我用 IdSSLOpenSSL.OpenSSLVersion 检查了我的 SSL 版本,发现我的版本是“OpenSSL 1.0.0g 2012 年 1 月 18 日”。我应该升级吗?如果是,如何? @Remy Lebeau
    • @RuhiGoktas 是的,您需要升级 OpenSSL,因为 1.0.0 已经过时。 Indy 支持的最新版本是 1.0.2(对 1.1.x 的支持正在开发中)。您可以从 indy.fulgan.com/SSL 获取更新的 DLL
    • 我从那里下载了“openssl-1.0.2q-x64_86-win64.zip”。 zip 中有 ssleay.ddl 和 libeay.dll,将它们复制到我的 Windows/System32 文件夹,然后从代码中再次检查版本,它没有改变。 (Windows/SysWOW64 也发生了同样的事情。如何让 Delphi 识别我的 SSL 更改?
    猜你喜欢
    • 2012-10-05
    • 2021-12-12
    • 2021-06-23
    • 1970-01-01
    • 2014-12-10
    • 1970-01-01
    • 2019-04-05
    • 1970-01-01
    • 2021-08-15
    相关资源
    最近更新 更多