【发布时间】:2018-07-04 04:22:48
【问题描述】:
我使用 Delphi 10.1 Update 2 和 Indy 10.6.2.5341。
我们在 SSL_accept 中遇到访问冲突。如果 TIdTCPServer 是使用 SSL 设置的,并且如果 TIdTCPServer 停止,则存在尚未协商 TLS 的打开连接,则会发生这种情况。
这看起来像是 Libssl32 或 Indy 中的问题。这可以通过以下代码和 Putty 使用 RAW 连接简单地复制。有谁知道防止这些崩溃的解决方案(或变通方法)?
procedure TSslCrash.HandlerOnExecute(AContext: TIdContext);
begin
//
end;
procedure TSslCrash.HandlerOnConnect(AContext: TIdContext);
begin
TIdSSLIOHandlerSocketBase(AContext.Connection.IOHandler).PassThrough := False;
end;
procedure TSslCrash.ButtonStartClick(Sender: TObject);
begin
LServer := TIdTCPServer.Create;
LIOHandler := TIdServerIOHandlerSSLOpenSSL.Create;
LIOHandler.SSLOptions.Mode := sslmServer;
LIOHandler.SSLOptions.Method := sslvTLSv1_2;
LIOHandler.SSLOptions.VerifyMode := [];
LIOHandler.SSLOptions.VerifyDepth := 0;
LIOHandler.SSLOptions.CertFile := 'localhost.crt';
LIOHandler.SSLOptions.RootCertFile := 'localhost.crt';
LIOHandler.SSLOptions.KeyFile := 'localhost.key';
LServer.Bindings.Add.Port := 10000;
LServer.IOHandler := LIOHandler;
LServer.OnExecute := HandlerOnExecute;
LServer.OnConnect := HandlerOnConnect;
LServer.Active := True;
//Now open a RAW connection with Putty on port 10000 and keep it open
end;
procedure TSslCrash.ButtonStopClick(Sender: TObject);
begin
if Assigned(LServer) then begin
LServer.Active := False; //This causes an AV in TIdSSLSocket.Accept
FreeAndNil(LIOHandler);
FreeAndNil(LServer);
end;
end;
【问题讨论】:
-
解决方法:使用执行 TLS/SSL 的反向代理(Apache HTTP 服务器),因此您可以在 Delphi 应用程序中使用纯 HTTP
-
很遗憾,这不是我们的解决方案,因为我们无法将 Apache(或其他反向代理)与我们的解决方案一起提供。