gpt4 book ai didi

delphi - TIdTCPClient 连接后启动 TLS

转载 作者:行者123 更新时间:2023-12-03 15:53:48 24 4
gpt4 key购买 nike

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

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

做这项工作缺少什么?

最佳答案

在调用 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 握手,您可以在之前将 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;

关于delphi - TIdTCPClient 连接后启动 TLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46409527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com