2017-09-25 146 views
3

我处理,需要启动TLS后连接和握手的协议,是这样的:TIdTCPClient启动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过程里面,送东西了连接,我得到了一个例外:“连接优雅地关闭”

有什么东西缺少做这项工作?

回答

3

你需要给你打电话之前TIdTCPClient.Connect()的对象SSLIOHandler分配给TIdTCPClient.IOHandler财产。如果您未指定IOHandler对象,则Connect()将创建默认的TCP对象,并且一旦套接字连接已打开,您就不能分配新的IOHandler对象。

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

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握手是在建立socket连接立即执行,您可以设置SSLIOHandler.PassThrough属性设为False调用TIdTCPClient.Connect()面前,握手会前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; 
+1

惊人!谢谢! – user2864778