Delphi – 与Indy组件的SSL TCP通信

前端之家收集整理的这篇文章主要介绍了Delphi – 与Indy组件的SSL TCP通信前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用Delphi XE2中的TIdSSLIOHandlerSocketOpenSSL Indy组件通过TCP将数据发送到SSL服务器(Apple推送通知服务).我已经让它在某种程度上工作但不确定我是否会以最佳方式进行.我正在做以下事情:

>设置SSL属性inc.证书的路径
>调用.Open方法打开连接
>检查OnStatusInfoEx事件中的AType参数,直到我收到’Handshake Done’
>使用.WriteDirect发送数据
>使用.Close关闭连接

有没有更好的方法来了解连接何时准备好发送数据?有没有人直接通过TCP使用TIdSSLIOHandlerSocketOpenSSL组件的示例代码?我发现的样本主要用于HTTP调用,其中仅附加TIdSSLIOHandlerSocketOpenSSL组件以保护连接.

解决方法

由于您使用的是客户端组件,因此如果服务器要验证客户端的证书,则只需在客户端上设置证书.

否则,将TIdSSLIOHandlerSocketOpenSSL的SSLOptions.Mode设置为sslmClient,您应该能够连接.

最好启用VerifyMode并在套接字组件上使用OnVerifyPeer事件来验证服务器证书上的指纹,以避免人员处于中间攻击.

根据您的Indy版本,您可能需要将SSLOptions方法设置为sslvTLSv1.某些Web服务器不再支持Indy 9默认使用的SSLv2.

下面是一些示例代码,演示了如何使用TCP组件通过SSL检索网页:

procedure TForm1.Button1Click(Sender: TObject);
var
  s: String;
begin
  IdTCPClient1.Host := 'example.com';
  IdTCPClient1.Port := 443;
  IdTCPClient1.Connect;
  IdTCPClient1.WriteLn('GET / HTTP/1.1');
  IdTCPClient1.WriteLn('Host: example.com');
  IdTCPClient1.WriteLn('');
  // Retrieve all the data until the server closes the connection
  s := IdTCPClient1.AllData;
  Memo1.Lines.Add(s);
end;

不要忘记将OpenSSL库libeay32.sll和ssleay32.dll包含在与Windows上的EXE相同的文件夹中.使用Indy 10的标准(最新)二进制文件.

猜你在找的Delphi相关文章