Delphi 6和Indy SSL连接不工作

Delphi 6和Indy SSL连接不工作,delphi,ssl,indy,Delphi,Ssl,Indy,我需要通过SSL使用Web服务。为了实现这一点,我在Delphi6中构建了一个web客户端,它使用Indy读取客户端证书并通过https写入soap请求。代码的编译版本是在IIS 5.0中运行的DLL。在我的本地机器上测试代码后,它工作正常(我在一个代理后面)。但在代码部署到prod服务器(而不是代理服务器)后,SSL连接失败,并显示“错误连接SSL” 这是我的密码: var Response: TStringStream; IdHttp: TIdHTTP; IdCnxSLL: TI

我需要通过SSL使用Web服务。为了实现这一点,我在Delphi6中构建了一个web客户端,它使用Indy读取客户端证书并通过https写入soap请求。代码的编译版本是在IIS 5.0中运行的DLL。在我的本地机器上测试代码后,它工作正常(我在一个代理后面)。但在代码部署到prod服务器(而不是代理服务器)后,SSL连接失败,并显示“错误连接SSL”

这是我的密码:

var
  Response: TStringStream;
  IdHttp: TIdHTTP;
  IdCnxSLL: TIdConnectionInterceptOpenSSL;
  XmlSoapDoc: IXMLDocument;
begin
  Response := TStringStream.Create('');
  IdHttp := TIdHTTP.Create(nil);
  IdCnxSLL := TIdConnectionInterceptOpenSSL.Create(nil);
  XmlSoapDoc := TXMLDocument.Create(nil);
  with IdCnxSLL do
   begin
    IdCnxSLL.SSLOptions.Method := sslvSSLv23;
    IdCnxSLL.SSLOptions.RootCertFile := IniHttpConnectionData.Values['RootCertFile'];
    IdCnxSLL.SSLOptions.CertFile := IniHttpConnectionData.Values['CertFile'];
    IdCnxSLL.SSLOptions.KeyFile := IniHttpConnectionData.Values['KeyFile'];
    IdCnxSLL.OnGetPassword :=  IdConInterceptOpenSSLGetPassword;
  end;
  with IdHttp do
  begin
    if bUseProxy then
    begin
       Request.ProxyServer := IniHttpConnectionData.Values['ProxyServer'];
       Request.ProxyPort := StrToIntDef(IniHttpConnectionData.Values['ProxyPort'], 0);
    end
    else
    begin
       Host := IniHttpConnectionData.Values['HTTPHost'];
       Port := StrToIntDef(IniHttpConnectionData.Values['HTTPPort'], 443);
    end;
    Request.ContentType := 'text/xml';
    Intercept := IdCnxSLL;
    InterceptEnabled := True;
  end;

  try
    IdHttp.Post(ServiceURL, SoapEnv, Response);
  except
    on E:EIdOSSLConnectError do
       LogError('SSL Connect Error: ' + E.Message);
    on E:Exception do
      LogError('Error' + E.ClassName + ' - ' + E.Message);
  end;
我还尝试将这段代码编译成exe程序,它可以正常工作。是否还有其他需要配置/添加的内容


谢谢。

您使用的是TIdConnectionInterceptOpenSSL,这一事实告诉我您使用的是非常旧版本的Indy。我猜是印地8号,与D6一起发货。Indy 8和更早版本不再得到Indy开发团队(我是该团队的成员)的正式支持。你真的应该升级到印地9号,如果不是印地10号的话。在Indy 9中,TIdConnectionInterceptOpenSSL被一个新的TIdSSLIOHandlerSocket组件所取代。此外,Indy 9和更早版本需要定制OpenSSL DLL,如果您对Indy版本使用了错误的DLL,这可能也会导致您的错误。另一方面,Indy 10现在使用OpenSSL网站上的标准DLL。

您使用TIdConnectionInterceptOpenSSL的事实告诉我,您使用的是一个非常旧的Indy版本。我猜是印地8号,与D6一起发货。Indy 8和更早版本不再得到Indy开发团队(我是该团队的成员)的正式支持。你真的应该升级到印地9号,如果不是印地10号的话。在Indy 9中,TIdConnectionInterceptOpenSSL被一个新的TIdSSLIOHandlerSocket组件所取代。此外,Indy 9和更早版本需要定制OpenSSL DLL,如果您对Indy版本使用了错误的DLL,这可能也会导致您的错误。另一方面,Indy 10现在使用OpenSSL网站上的标准DLL。

最终它成功了。尽管我强烈建议你使用雷米建议的新版本的印地。我将张贴的步骤,使我的伎俩,因为应该有其他人与同样的问题

我发布的原始代码是功能性的,当我们需要通过安全http(https)发布信息时,它可以工作,但远程服务器需要使用客户端证书进行事先身份验证

为了使其正常工作,必须验证以下各项:

  • TIdHttp和TIdConnectionInterceptOpenSSL配置
  • 证书
  • 对于前两个步骤,请遵循此处提到的步骤或(如果链接过期)谷歌“IndySSL-使用证书验证”。这对我有用

  • Indy SSL DLL。(对于D6/Indy 8,请从或下载Indy_openssl096g.zip)此DLL,其中只有适用于此版本Indy的DLL

  • 希望这会有所帮助。

    最终它成功了。尽管我强烈建议你使用雷米建议的新版本的印地。我将张贴的步骤,使我的伎俩,因为应该有其他人与同样的问题

    我发布的原始代码是功能性的,当我们需要通过安全http(https)发布信息时,它可以工作,但远程服务器需要使用客户端证书进行事先身份验证

    为了使其正常工作,必须验证以下各项:

  • TIdHttp和TIdConnectionInterceptOpenSSL配置
  • 证书
  • 对于前两个步骤,请遵循此处提到的步骤或(如果链接过期)谷歌“IndySSL-使用证书验证”。这对我有用

  • Indy SSL DLL。(对于D6/Indy 8,请从或下载Indy_openssl096g.zip)此DLL,其中只有适用于此版本Indy的DLL

  • 希望这会有所帮助。

    你说得对,我正在研究D6/Indy 8。我无法更新到indy 9或10,因为已有一些应用程序使用此版本的Delphi和indy。对于未来的新发展,我肯定会转向Indy 10。谢谢你的回复。你说得对,我正在研究D6/Indy 8。我无法更新到indy 9或10,因为已有一些应用程序使用此版本的Delphi和indy。对于未来的新发展,我肯定会转向Indy 10。谢谢你的回复。帮助了我。谢谢你,帮了我。非常感谢。