我正在处理一个协议,它需要在连接和握手之后启动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过程,并通过连接发送了一些东西,我就得到了异常:“连接优雅地关闭”
缺少什么东西来做这个工作吗?
发布于 2017-09-25 19:39:40
在调用SSLIOHandler之前,需要将TIdTCPClient.IOHandler对象分配给TIdTCPClient.Connect()属性。如果不分配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()之前将TIdTCPClient.Connect()属性设置为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;https://stackoverflow.com/questions/46409527
复制相似问题