如何在Delphi 10.2.3的THTTPRIO组件中强制启用TLS 1.2/1.3?
在Delphi 10.2.3 Tokyo中强制启用TLS 1.2/1.3及替代WinInet的方案
一、直接通过代码强制TLS 1.2/1.3(无需修改系统Internet选项)
THTTPRIO依赖WinInet,可通过WinInet API手动指定TLS版本,无需改动系统设置:
- 在创建THTTPRIO实例前,调用
InternetSetOption配置安全标志:const INTERNET_OPTION_SECURITY_FLAGS = 31; SECURITY_FLAG_ENABLE_TLS1_2 = $00000080; SECURITY_FLAG_ENABLE_TLS1_3 = $00000200; // 仅Windows 10 1903+/Server 2019+支持TLS1.3 var Flags: DWORD; begin // 获取当前安全标志 InternetSetOption(nil, INTERNET_OPTION_SECURITY_FLAGS, @Flags, SizeOf(Flags)); // 启用TLS1.2和1.3,保留原有其他标志 Flags := Flags or SECURITY_FLAG_ENABLE_TLS1_2 or SECURITY_FLAG_ENABLE_TLS1_3; // 应用新配置 InternetSetOption(nil, INTERNET_OPTION_SECURITY_FLAGS, @Flags, SizeOf(Flags)); // 后续正常创建并使用THTTPRIO with THTTPRIO.Create(nil) do try URL := '你的Web服务地址'; // 调用服务方法 finally Free; end; end; - 注意:TLS1.3支持受限于操作系统版本,Windows 7等旧系统无法通过WinInet启用。
二、替代WinInet的TLS实现方案
1. 修复Indy组件的证书问题
你之前尝试的USE_INDY指令加载证书失败,大概率是配置细节问题,可调整如下:
- 先升级Indy到10.6.2+版本(Delphi 10.2.3自带版本较旧,兼容性差)
- 手动配置SSL处理器:
var HTTPRIO: THTTPRIO; SSLHandler: TIdSSLIOHandlerSocketOpenSSL; begin HTTPRIO := THTTPRIO.Create(nil); try SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil); try // 指定TLS版本 SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_3]; // 配置证书(根据实际情况选择PEM格式的证书/私钥/根证书) SSLHandler.SSLOptions.CertFile := 'cert.pem'; SSLHandler.SSLOptions.KeyFile := 'key.pem'; SSLHandler.SSLOptions.RootCertFile := 'root.pem'; // 测试环境可临时忽略证书验证(生产环境禁用) SSLHandler.OnVerifyPeer := procedure(Sender: TObject; AOk: Boolean; ADepth: Integer; AError: Integer; var AAccept: Boolean) begin AAccept := True; end; // 绑定到HTTPRIO的传输节点 (HTTPRIO.HTTPWebNode as THTTPReqResp).IOHandler := SSLHandler; // 调用Web服务 HTTPRIO.URL := '你的Web服务地址'; finally SSLHandler.Free; end; finally HTTPRIO.Free; end; end;
2. 使用第三方SOAP客户端库
如果不想折腾原生组件,可替换为更灵活的第三方库:
- 基于OpenSSL的自定义SOAP客户端:完全脱离WinInet,自主控制TLS版本和证书逻辑
- RemObjects SDK:商业库,提供成熟的SOAP和TLS配置选项
三、修改Delphi SOAP源码(不推荐但可行)
若坚持使用原生THTTPRIO,可修改Soap.SOAPHTTPTrans.pas源码:
- 在
THTTPReqResp.SetInternetHandle方法中,添加调用InternetSetOption配置TLS版本的代码,确保每次建立连接时都强制启用指定的TLS协议。
内容的提问来源于stack exchange,提问作者Carlos Matos
相关产品推荐
相关产品推荐

