2017-09-25 5 views
3

私は、TLSは後に接続し、ハンドシェークを開始する必要があるプロトコルを使用して、このようなものを扱っています:は、TLSが後に接続を開始TIdTCPClient

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()呼び出す前TIdTCPClient.IOHandlerプロパティSSLIOHandlerオブジェクトを割り当てる必要があります。 IOHandlerオブジェクトを割り当てない場合、Connect()はデフォルトのTCPのみのオブジェクトを作成し、ソケット接続が開かれた後は新しいIOHandlerオブジェクトを割り当てることはできません。その後

、あなたがTLSハンドシェイク起動する準備ができているとき、FalseにSSLIOHandler.PassThroughプロパティを設定します(このような状況には適用されません)将来の参照のために、あなたは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; 

注意をソケット接続を確立した直後に行われ、あなたはTIdTCPClient.Connect()を呼び出す前に、FalseにSSLIOHandler.PassThroughプロパティを設定することができ、そして握手は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

関連する問題