2017-09-25 85 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