Delphi 即使制定了发展计划,我也会继续保持;套接字错误“10054对等方重置连接”;在Indy中使用TIdHTTP从https url获取

Delphi 即使制定了发展计划,我也会继续保持;套接字错误“10054对等方重置连接”;在Indy中使用TIdHTTP从https url获取,delphi,indy,indy10,delphi-10-seattle,idhttp,Delphi,Indy,Indy10,Delphi 10 Seattle,Idhttp,我正在使用TIdHTTP从https URL获取信息,在使用http之前,我的代码工作正常,但在https上我没有 套接字错误#10054对等方重置连接 在很多答案中,我读到TLS1.0是默认值,所以我尝试将其设置为TLS1.2 我尝试在TIdHTTP和TIdSSLIOHandlerSocketOpenSSL中更改许多属性,但没有成功 失败的URL是https://nesufficio.my.qualibus.it/FeriePermessiDemo/DOQualibus/QappCommand

我正在使用
TIdHTTP
从https URL获取信息,在使用http之前,我的代码工作正常,但在https上我没有

套接字错误#10054对等方重置连接

在很多答案中,我读到TLS1.0是默认值,所以我尝试将其设置为TLS1.2

我尝试在
TIdHTTP
TIdSSLIOHandlerSocketOpenSSL
中更改许多属性,但没有成功

失败的URL是
https://nesufficio.my.qualibus.it/FeriePermessiDemo/DOQualibus/QappCommandHandler

有一个握手问题我无法克服,如果我禁用防火墙和代理并直接连接到http URL,它就会工作(即使在这种情况下,我必须使用完整的URL来进行有意义的行为)。所以我的问题完全是在印地:如何成功地连接到那个URL

这是我使用的代码:

procedure TForm1.btnGetFromMyWebserver(Sender: TObject);
var
  IdHTTP: TIdHTTP;
  IdSSLIOHandlerSocketOpenSSL: TIdSSLIOHandlerSocketOpenSSL;
  response, url: string;
begin
  IdHTTP := TIdHTTP.Create;
  // here i set the custom headers that are not relevant
  // to study the connection closed by peer problem
  try

      try
        IdSSLIOHandlerSocketOpenSSL :=  TIdSSLIOHandlerSocketOpenSSL.Create(IdHTTP);
        IdSSLIOHandlerSocketOpenSSL.Port := 443; // I tried to force the port to 443
        IdSSLIOHandlerSocketOpenSSL.SSLOptions.Mode       := sslmClient;
        IdSSLIOHandlerSocketOpenSSL.SSLOptions.SSLVersions:= [sslvTLSv1_2];
        IdHTTP.IOHandler := IdSSLIOHandlerSocketOpenSSL;
        IdHTTP.HandleRedirects := True;
        url := 'https://nesufficio.my.qualibus.it/FeriePermessiDemo/DOQualibus/QappCommandHandler'; // this is not the actual endpoint but it is enough to reproduce the handshaking error
        response := IdHTTP.Get(url);
      except
        on e:Exception
        do
          response := e.message;
      end;
  finally
    IdHTTP.Free;
  end;
  ShowMessage('Response was:' + response);
end;
你能帮我找出问题所在吗

我的indy版本是
10.6.2.5298
,我使用的是Delphi 10西雅图


提前感谢。

我意识到我使用的是非常旧的开放式SSL DLL,根据Remy Lebeau的建议,通过从中获取最新的DLL,我成功地使gethttp调用在使用
https
端点的情况下也能正常工作


因此,解决方案就是使用最新版本的开放式SSl DLL。

调试两端-如果服务器和/或代理端出现混乱/崩溃等情况,将导致连接中断。谢谢。消息永远不会到达服务器,如果我简单地将URL粘贴到浏览器中,我会在浏览器中看到“缺少主键”的回复,但是使用indy我无法获得结果,因此问题是在delphi端,而不是服务器端。我无法告诉Indy如何正确使用https执行调用。@LaBracca您所显示的非常好(尽管您可以删除
端口
分配,因为
Get()
将覆盖它,
sslversion
应该是
[sslvTLSv1,sslvTLSv1\u 1,sslvTLSv1\u 2]
除非您知道服务器仅支持TLS 1.2)。所以问题一定是别的。例如,您使用的是哪个版本的OpenSSL DLL?您是否尝试升级到最新版本?你试过嗅探网络流量来比较Indy的TLS握手和web浏览器的TLS握手吗?@RemyLebeau非常感谢!我从
https://indy.fulgan.com/SSL/
这些DLL(日期为2019年,我的是2017年)工作正常。关于TLS版本我的服务器只支持1.2。@LaBracca仅供参考,请参阅Indy的博客