加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi – 与Indy组件的SSL TCP通信

发布时间:2020-12-15 10:06:28 所属栏目:大数据 来源:网络整理
导读:我正在使用Delphi XE2中的TIdSSLIOHandlerSocketOpenSSL Indy组件通过TCP将数据发送到SSL服务器(Apple推送通知服务).我已经让它在某种程度上工作但不确定我是否会以最佳方式进行.我正在做以下事情: 设置SSL属性inc.证书的路径 调用.Open方法打开连接 检查On
我正在使用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的标准(最新)二进制文件.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读