Indy TIdFTP连接TLS1.2服务器报错534:Protection level C not allowed
解决TIdFTP调用List时出现534 Protection level C not allowed的问题
错误534 Protection level C not allowed的核心原因是FTP客户端与服务器的加密保护级别不匹配:FileZilla服务器要求更高的加密保护,而TIdFTP默认的保护级别为明文(C级),不符合服务器要求。以下是具体解决步骤:
1. 调整TIdFTP的保护级别设置
- 在设计期或代码中,将TIdFTP的
Protection属性设置为ftpsPrivate(对应保护级别P,所有数据传输均加密),这是FileZilla服务器常用的强制保护级别。 - 避免使用
ftpsClear(C级,明文传输)或ftpsSafe(S级,仅命令加密),这两个级别会被服务器拒绝。
2. 正确配置SSLIOHandler的TLS版本与模式
- 明确指定SSL版本为TLS 1.2及以上,确保与服务器最低要求匹配:
IdSSLIOHandlerSocketOpenSSL1.SSLOptions.SSLVersions := [sslvTLSv1_2, sslvTLSv1_3]; - 确认
SSLOptions.Mode设置为sslmClient,保证SSLIOHandler以客户端模式工作。 - 关键检查:确保项目使用的OpenSSL库文件(32位为
libeay32.dll、ssleay32.dll;64位为libcrypto-1_1-x64.dll、libssl-1_1-x64.dll)是支持TLS 1.2的最新版本,旧版本OpenSSL无法适配服务器要求。
3. 规范FTPS连接流程
如果使用显式FTPS(默认端口21),必须在登录前完成TLS握手,正确流程如下:
IdFTP1.Host := '你的FTP服务器地址'; IdFTP1.Port := 21; IdFTP1.Username := '你的用户名'; IdFTP1.Password := '你的密码'; IdFTP1.Passive := True; // 推荐使用被动模式,避免端口映射问题 // 绑定SSLIOHandler IdFTP1.IOHandler := IdSSLIOHandlerSocketOpenSSL1; try IdFTP1.Connect; IdFTP1.AuthTLS; // 启用显式TLS加密,这一步不能省略 IdFTP1.Login; IdFTP1.Protection := ftpsPrivate; // 设置保护级别 IdFTP1.List; // 此时调用List即可正常执行 finally IdFTP1.Disconnect; end;
如果使用隐式FTPS(端口990),无需调用AuthTLS,但要确保端口设置正确,且SSLIOHandler在连接时自动启用加密。
4. 核对FileZilla服务器设置
进入FileZilla服务器管理界面,确认:
- TLS设置中最低版本为1.2(与你当前配置一致)
- 保护级别设置为“强制私有”或允许私有级别,确保服务器接受P级保护的连接
内容的提问来源于stack exchange,提问作者user3082957
相关产品推荐
相关产品推荐

