【问题标题】:Delphi 6 and Indy SSL connection not workingDelphi 6 和 Indy SSL 连接不工作
【发布时间】:2009-09-14 16:22:05
【问题描述】:

我需要通过 SSL 使用 Web 服务。为了实现这一点,我在 Delphi 6 中构建了一个 Web 客户端,它使用 Indy 读取客户端证书并通过 https 编写肥皂请求。代码的编译版本是在 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 程序,它可以工作。还有什么我需要配置/添加的吗?

谢谢。

【问题讨论】:

  • 对不起,这个例子中的 IniHttpConnectionData 是什么?

标签: delphi ssl indy


【解决方案1】:

您使用 TIdConnectionInterceptOpenSSL 的事实告诉我您使用的是 非常 旧版本的 Indy。我猜是 D6 附带的 Indy 8。 Indy 8 及更早版本不再由 Indy 开发团队(我是其中的一员)正式支持。如果不升级到 Indy 10,您真的应该升级到 Indy 9。在 Indy 9 中,TIdConnectionInterceptOpenSSL 被新的 TIdSSLIOHandlerSocket 组件替换。此外,Indy 9 和更早版本需要定制的 OpenSSL DLL,如果您为您的 Indy 版本使用了错误的 DLL,这也可能导致您的错误。另一方面,Indy 10 现在使用来自 OpenSSL 网站的标准 DLL。

【讨论】:

  • 你说得对,我正在开发 D6/Indy 8。我无法更新到 indy 9 或 10,因为有一些现有的应用程序使用了这个版本的 Delphi 和 Indy。对于未来的新发展,我一定会切换到 Indy 10。感谢您的回复。
【解决方案2】:

终于成功了。尽管我强烈建议您按照 Remy 的建议使用更新版本的 Indy。我将发布对我有用的步骤,因为应该有其他人有同样的问题。

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

为了使其工作,有必要验证以下内容:

  1. TIdHttp 和 TIdConnectionInterceptOpenSSL 配置
  2. 证书

对于前两个步骤,请按照此处提到的步骤link text 或(如果链接已过期)谷歌“IndySSL - 使用证书身份验证”。它对我有用。

  1. Indy SSL DLL。 (对于 D6/Indy 8,从 Indy SSL 或 Intelicom 下载 indy_openssl096g.zip)这个 DLL 是唯一适用于这个版本的 Indy 的 DLL。

希望这会有所帮助。

【讨论】:

  • 帮助了我。谢谢。
  • 最后两个链接现在已经失效了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 2012-02-28
  • 2017-03-03
  • 2017-02-15
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多