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

如何配置带SSL的TidFTP?迁移主机后连接异常求助

Indy FTP客户端SSL连接10054错误排查与修复

看起来你遇到了切换主机后Indy FTP客户端的SSL连接问题,10054错误通常意味着远程主机主动关闭了连接。结合你的代码和配置,我整理了几个关键的排查点和修复建议:

1. 确保SSL IOHandler正确关联到FTP组件

我注意到你在窗体里添加了TIdSSLIOHandlerSocketOpenSSL组件,但代码里没有将它分配给myFTP的IOHandler属性!这是最常见的疏漏——如果FTP组件不使用SSL IOHandler,你的UseTLS设置根本不会生效,服务器会因为预期SSL握手但没收到而强制关闭连接(也就是10054错误)。

修改你的btnConnectFTPClick方法,在设置UseTLS之前加上这行:

myFTP.IOHandler := idSSLIOHandlerSocketOpenSSL;

2. 检查OpenSSL库文件是否存在且兼容

Indy的SSL组件依赖OpenSSL动态库,你需要确保程序目录下有正确版本的库文件:

  • 32位Delphi程序需要32位的libcrypto-1_1.dll和libssl-1_1.dll(或旧版libeay32.dll/ssleay32.dll,取决于Indy版本)
  • 64位程序则需要对应64位的库文件
  • 库文件必须和你的Indy版本兼容,建议使用Indy官方提供的对应版本

如果库文件缺失或不匹配,SSL握手会直接失败,导致服务器关闭连接。

3. 调整SSL协议版本

很多现代主机已经禁用了旧的SSLv3、TLSv1.0等协议,强制使用TLSv1.2或更高版本。你可以显式设置SSL的协议版本,避免握手失败:

idSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1_2;
// 若服务器支持,也可尝试最新的TLSv1.3
// idSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1_3;

4. 优化被动模式和数据端口保护设置

你的代码里已经设置了Passive := True,这是现代FTP服务器的标准配置,但可以调整DataPortProtection的设置来匹配服务器要求:

  • 如果服务器要求数据连接也使用SSL,ftpdpsPrivate是正确的
  • 若服务器允许明文数据连接(不推荐,但部分主机可能支持),可尝试ftpdpsClear
  • 同时确保服务器的被动端口范围(通常是49152-65535)没有被防火墙或主机提供商拦截

5. 开启调试日志定位问题

开启Indy的日志功能可以帮你看到FTP连接的完整交互过程,找出具体出错环节。你可以添加一个TIdLogFile组件到窗体,然后设置:

myFTP.Intercept := IdLogFile1;
IdLogFile1.Filename := 'ftp_log.txt';
IdLogFile1.Active := True;

连接后查看日志文件,就能看到服务器的响应和SSL握手的细节,更容易定位问题。

修改后的关键代码片段

把这些修改整合到你的连接方法里,示例如下:

procedure TForm1.btnConnectFTPClick(Sender: TObject);
begin
  try
    Label2.Caption := '';
    Label4.Caption := '';

    if (myFTP.Connected) then
      myFTP.Disconnect;

    // 省略输入验证部分...

    myFTP.Host := edHost.Text;
    myFTP.Username := edUser.Text;
    myFTP.Password := edPassword.Text;
    myFTP.Port := StrToInt(edPort.Text);

    if (ckbUseSSL.Checked) then
    begin
      // 关联SSL IOHandler
      myFTP.IOHandler := idSSLIOHandlerSocketOpenSSL;
      // 设置SSL协议版本
      idSSLIOHandlerSocketOpenSSL.SSLOptions.Method := sslvTLSv1_2;
      myFTP.UseTLS := utUseExplicitTLS;
      myFTP.DataPortProtection := ftpdpsPrivate;
      myFTP.Passive := True;
    end
    else
    begin
      myFTP.IOHandler := nil; // 切换回默认IOHandler
      myFTP.DataPortProtection := ftpdpsClear;
      myFTP.UseTLS := utNoTLSSupport;
      myFTP.Passive := False;
    end;

    // 增加连接超时设置
    myFTP.ConnectTimeout := 10000; // 10秒
    myFTP.Connect;

    Label4.Caption := 'Connected';
    Label2.Caption := '';
  except
    on e:Exception do
    begin
      Label4.Caption := 'Failed to connect';
      Label2.Caption := e.Message;
    end;
  end;
end;

先试试这些修改,尤其是第一步关联IOHandler,这应该是导致10054错误的主要原因。如果还是有问题,查看日志文件的内容,应该能找到更具体的错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:46:14