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
相关产品推荐
相关产品推荐

