首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >连接后TIdTCPClient启动TLS

连接后TIdTCPClient启动TLS
EN

Stack Overflow用户
提问于 2017-09-25 16:02:42
回答 1查看 658关注 0票数 3

我正在处理一个协议,它需要在连接和握手之后启动TLS,如下所示:

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
var
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  SSL:= TIdSSLIOHandlerSocketOpenSSL.Create;
  SSL.SSLOptions.Method:= sslvTLSv1_2;
  IdTCPClient1.Connect;
  if IdTCPClient1.Connected then
  begin
    //plain-text operations
    HandShake;
    CheckAnswer;
    //finish plain-text start TLS
    IdTCPClient1.IOHandler:= SSL;
    SendTLSSecureBytes;
  end;
end;

一旦我进入了SendTLSSecureBytes过程,并通过连接发送了一些东西,我就得到了异常:“连接优雅地关闭”

缺少什么东西来做这个工作吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-25 19:39:40

在调用SSLIOHandler之前,需要将TIdTCPClient.IOHandler对象分配给TIdTCPClient.Connect()属性。如果不分配IOHandler对象,Connect()将创建默认的TCP专用对象,并且一旦打开套接字连接,就不能分配新的IOHandler对象。

然后,在准备调用TLS握手时,将SSLIOHandler.PassThrough属性设置为False:

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
var
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  SSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdTCPClient1);
  SSL.SSLOptions.Method := sslvTLSv1_2;
  IdTCPClient1.Connect; // raises exception if failed
  // do plain-text operations, then...
  SSL.PassThrough := False // do TLS handshake
  SendTLSSecureBytes; // will be encrypted by TLS
end;

注意,对于将来的引用(不适用于这种情况),如果需要在建立套接字连接时立即执行TLS握手,可以在调用TIdTCPClient.Connect()之前将TIdTCPClient.Connect()属性设置为False,并且握手将在Connect()退出之前完成:

代码语言:javascript
复制
procedure TForm1.Button1Click(Sender: TObject);
var
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  SSL := TIdSSLIOHandlerSocketOpenSSL.Create(IdTCPClient1);
  SSL.SSLOptions.Method := sslvTLSv1_2;
  SSL.PassThrough := False // do TLS handshake upon connect
  IdTCPClient1.Connect; // raises exception if failed
  SendTLSSecureBytes; // will be encrypted by TLS
end;
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46409527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档