You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:16:07