【问题标题】:TIdTCPClient start TLS after connectedTIdTCPClient 连接后启动 TLS
【发布时间】:2017-09-25 16:02:42
【问题描述】:

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

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 过程,并通过连接发送一些东西,我就会得到异常:“连接正常关闭”

做这项工作缺少什么?

【问题讨论】:

    标签: delphi indy indy10


    【解决方案1】:

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

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

    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()之前将SSLIOHandler.PassThrough属性设置为False,并且握手将在Connect() 退出之前完成:

    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;
    

    【讨论】:

    • 太棒了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2012-09-17
    • 2020-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多