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

Delphi XE中用Indy TIdHTTP连接DropBox(HTTPS)报错求助

问题分析与解决方案

错误error:1409442E:SSL routines:SSL3_READ_BYTES:tlsv1 alert protocol version本质是SSL握手时协议版本协商失败,结合你的环境和代码,主要有以下几个问题需要修复:

1. Indy TLS 1.2配置不完整

Indy 10.5.9.0中仅设置SSLOptions.Method := sslvTLSv1_2不足以强制使用TLS1.2,且未正确设置SNI(Server Name Indication)——DropBox服务器需要SNI才能正确协商协议。需补充以下配置:

  • 将ssl.host设置为目标域名content.dropboxapi.com,确保SNI正确发送
  • 显式禁用旧协议版本,仅允许TLS1.2
  • 明确设置SSL模式为客户端模式,避免使用sslmUnassigned

2. 资源泄漏问题

代码中Source和Ssl对象未在finally块中释放,会导致内存泄漏,同时可能影响后续SSL上下文的正确初始化。

3. DropBox API请求头格式错误

DropBox-API-Arg中使用了HTML转义的",这会导致DropBox无法解析JSON参数,应直接使用双引号编写JSON字符串。

修改后的完整代码

procedure TForm2.btn1Click(Sender: TObject);
const
  API_URL = 'https://content.dropboxapi.com/2/files/upload';
  cFile   = 'D:\testfile.txt';
var
  wAccessToken : string;
  Source: TFileStream;
  IdHTTP: TIdHTTP;
  Res : string;
  Ssl: TIdSSLIOHandlerSocketOpenSSL;
begin
  wAccessToken := 'muj_token';
  IdHTTP := TIdHTTP.Create(nil);
  Ssl := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
  Source := TFileStream.Create(cFile, fmOpenRead);
  try
    IdHTTP.HandleRedirects := True;
    // 配置SSL参数,强制TLS1.2并设置SNI
    Ssl.SSLOptions.Method := sslvTLSv1_2;
    Ssl.SSLOptions.Mode := sslmClient;
    Ssl.SSLOptions.VerifyMode := [];
    Ssl.SSLOptions.VerifyDepth := 0;
    Ssl.Host := 'content.dropboxapi.com';
    Ssl.SSLOptions.SSLVersions := [sslvTLSv1_2];

    IdHTTP.IOHandler := Ssl;
    // 设置请求头
    IdHTTP.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + wAccessToken;
    // 修正JSON参数格式,直接使用双引号
    IdHTTP.Request.CustomHeaders.Values['Dropbox-API-Arg'] :=
      '{"autorename": false,"mode": "add","mute": false,"path": "/test.txt","strict_conflict": false}';
    IdHTTP.Request.ContentType := 'application/octet-stream';

    Memo1.Lines.Add(IdHTTP.Request.CustomHeaders.Text);

    Res := IdHTTP.Post(API_URL, Source);
    Memo1.Lines.Add('上传结果:' + Res);
  finally
    Source.Free;
    Ssl.Free;
    IdHTTP.Free;
  end;
end;

额外注意事项

  • OpenSSL库匹配:确保使用的libeay32.dll和ssleay32.dll是32位版本(Delphi XE3默认编译32位程序),且版本不低于1.0.1t(推荐1.0.2系列或更高),将文件放在程序运行目录或系统PATH路径中。
  • Indy版本限制:如果上述修改仍无效,考虑升级Indy到最新版本(如10.6.2+),旧版本的Indy对TLS1.2的支持存在兼容性问题。

内容的提问来源于stack exchange,提问作者L. Pospisil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:35:30