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

动态创建Indy组件时如何使其启用TLSv1.2?

解决动态创建Indy IdHTTP时启用TLS 1.2的问题

我之前帮朋友处理过一模一样的问题——更新了OpenSSL但还是连不上GitHub,核心原因就是没明确强制Indy使用TLS 1.2,而是让它自动协商,结果它可能尝试了旧版本导致被GitHub拒绝。

下面是具体的实现步骤(以Delphi环境为例,其他使用Indy的语言逻辑类似):

1. 确保引用必要的单元

首先要在代码里引入Indy的HTTP和SSL相关单元,比如:

uses
  IdHTTP, IdSSLOpenSSL, IdSSL;

2. 动态创建组件并配置TLS 1.2

创建TIdHTTP的同时,必须配套创建TIdSSLIOHandlerSocketOpenSSL,并明确指定SSL版本为TLS 1.2,代码示例如下:

var
  HttpClient: TIdHTTP;
  SSLHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  // 初始化HTTP客户端
  HttpClient := TIdHTTP.Create(nil);
  try
    // 创建并配置SSL处理器
    SSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(HttpClient);
    // 强制只使用TLS 1.2,禁用所有旧版本
    SSLHandler.SSLOptions.SSLVersions := [sslvTLSv1_2];
    SSLHandler.SSLOptions.Mode := sslmClient; // 设置为客户端模式

    // 将SSL处理器绑定到HTTP客户端
    HttpClient.IOHandler := SSLHandler;

    // 测试请求(比如访问GitHub的API)
    try
      ShowMessage(HttpClient.Get('https://api.github.com/users/octocat'));
    except
      on E: Exception do
        ShowMessage('请求失败: ' + E.Message);
    end;
  finally
    HttpClient.Free; // 释放时会自动释放关联的SSLHandler
  end;
end;

3. 额外排查要点

  • OpenSSL DLL位数匹配:32位程序必须用32位的libeay32.dll/ssleay32.dll(或新版本的libcrypto-1_1.dll/libssl-1_1.dll),64位程序用对应64位版本,放在程序运行目录下。
  • Indy版本兼容性:如果你的Indy版本太老(比如10.5.x及更早),可能对TLS 1.2的支持不完善,建议升级到Indy 10.6.2及以上版本。
  • 检查错误细节:如果还是报错,捕获具体的异常信息,比如是SSL握手失败还是其他问题,能帮你更快定位。

这样配置后,Indy就会强制使用TLS 1.2和GitHub建立连接,应该就能解决无法下载内容的问题了。

内容的提问来源于stack exchange,提问作者Adriaan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 06:55:09