我通过使用项目向导并选择 HTTPS 协议以及合适的 SSL 证书创建了一个基本的独立 DataSnap 服务器。
一切正常,除了它仅支持 TLS 1.0。服务器支持 TLS 1.2 对于我的项目至关重要。我需要做什么才能让它使用 TLS 1.2?我已确保使用最新版本的 OpenSSL DLL。
我正在使用 Delphi 10.0 Seattle Update 1。我查看了 Delphi 10.1 Berlin 的错误修复列表,其中提到了这一点:
RSP-12760 IPPeerAPI 缺乏 TLS 1.2 支持
查看 RSP-12760,看起来这可能相关,但我有点认为这是针对 HTTPS 客户端而不是服务器的修复。
任何人都可以确认使用 10.1 Berlin 构建的 DataSnap 服务器是否支持 TLS 1.2?或者它应该在 10.0 西雅图工作吗?
我设法用 Delphi Rio 10.3.3 做到这一点。 当前的数据快照并不能改变这一点。 Delphi XE 的下一个版本似乎已经允许这样做。 你可以在代码中看到它
procedure TDSHTTPSServerIndy.InitializeServer;
var
LIOHandler: IIPServerIOHandlerSSLOpenSSL;
begin
inherited;
if Server <> nil then
begin
LIOHandler := PeerFactory.CreatePeer(IPImplementationID, IIPServerIOHandlerSSLOpenSSL, Server.GetObject as TComponent) as IIPServerIOHandlerSSLOpenSSL;
LIOHandler.SSLOptions.Method := TIPSSLVersionPeer.sslvTLSv1;
LIOHandler.SSLOptions.Mode := TIPSSLModePeer.sslmServer;
LIOHandler.SSLOptions.CertFile := FCertFile;
LIOHandler.SSLOptions.RootCertFile := FRootCertFile;
LIOHandler.SSLOptions.KeyFile := FKeyFile;
LIOHandler.OnGetPassword := OnGetPassword;
Server.IOHandler := LIOHandler;
Assert(not Assigned(Server.OnConnect));
Server.OnConnect := ServerOnConnect;
end;
结束;
因为无法重新编译datasnap源,所以要在派生类中更改该行。只是:
创建我们自己的类(例如:TNewClass)来替换 TDSHTTPSServerIndy,然后将代码行更改为:
LIOHandler.SSLOptions.Method := TIPSSLVersionPeer.sslvTLSv1_2;
创建新类,派生自TDSHttpService
覆盖
function TDSHTTPService.CreateHttpServer
,因此它将在第1点使用我们的新类(TNewClass)
注意:TDSHTTPSServerIndy 无法派生,因为该类是在实现部分声明的,因此我们必须重新创建此类。
确保使用最新的 libeay32.dll 和 ssleay32.dll,至少版本 1.0.2.21。
如果您需要完整的代码示例,请给我发电子邮件。
谢谢。