Delphi:IdHTTP + SSL不起作用。没错!

时间:2011-07-14 08:03:56

标签: delphi ssl idhttp

我使用TidHTTP + TIdSSLIOHandlerSocketOpenSSL + 2 DLL:来自http://indy.fulgan.com/SSL的ssleay32.dll和libeay32.dll。

但我可以在HTTP Analyzer中看到我的程序的所有工作!它可以用作HTTP,而不是HTTPS。如果我使用 Opera ,我看不到使用相同网站下载(https://esta.cbp.dhs.gov/esta)。

我没有为TidHTTP和TIdSSLIOHandlerSocketOpenSSL设置任何特殊参数(可能是我必须但我不知道到底是什么)。

我必须使用TIdSSLVersion(sslvSSLv23)+ SSL证书的位置吗?我在哪里可以获得此证书?或者只有RootCertFile?

如何将idHttp的端口更改为443(我必须这样做吗?)?

我用:

procedure TForm1.FormCreate(Sender: TObject);
var mem:tmemorystream;
begin
try
  mem:=TMemoryStream.Create();
  try
    idhttp1.Get('https://esta.cbp.dhs.gov/esta/',Mem);
  except
   on E : Exception do ShowMessage(E.Message);
  end;
finally
  mem.Free;
  idhttp1.Free;
end;
end;

请参阅我的视频:http://liga-installer.realservers.info/ssl.mp4

截屏:

enter image description here enter image description here enter image description here

谢谢谢谢,谢谢你的帮助!!!

2 个答案:

答案 0 :(得分:11)

这个简单的示例适用于Delphi XE开箱即用,因此您无需在客户端更改端口或使用证书。它基于an example from RosettaCode

Uses
  IdHttp, IdSSLOpenSSL

...

procedure TForm2.Button1Click(Sender: TObject);
var
  s: string;
  lHTTP: TIdHTTP;
begin
  lHTTP := TIdHTTP.Create(nil);
  try
    lHTTP.IOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(lHTTP);
    lHTTP.HandleRedirects := True;
    s := lHTTP.Get('https://esta.cbp.dhs.gov/esta/');
    RichEdit1.Text := s;
  finally
    lHTTP.Free;
  end;
end;

问题可能是您需要部署的DLL的版本。由于最近的版本修复了安全问题,我建议将您的Indy版本升级到最新版本并使用fulgan网站上最新的OpenSSL库。

更新: 您是说您无法使用网络浏览器查看网站,或者当您这样做时无法在HTTP分析器中看到流量?正如Rob提到的,如果使用常规Web浏览器看不到该站点,那么问题可能不在于您的应用程序。

答案 1 :(得分:2)

您使用了错误的工具来检查通信。您的观察仅显示使用的协议 - 即使使用SSL / TLS也是HTTP 1.0或1.1。

尝试使用SmartSnif或Wireshark等工具来检查真实的网络流量。您将看到整个流量正在使用带有加密数据的端口443。

HTTP / 1.1(或1.0)的标头响应对于HTTPS流量绝对正确,SSL / TLS加密更改传输的数据但是传输层在HTTP流量之上。

关于HTTP Analyzer(来自他们在http://www.ieinspector.com/httpanalyzer/的网站): “主要特点: 支持HTTPS,显示通过HTTPS / SSL 连接发送的未加密数据,与HTTP的详细程度相同。“

正如我所说,它解码SSL并向您显示基于HTTP的未加密流量。

此致 阿尔维德