ftp_nlist(): data_accept: SSL/TLS 握手失败

ftp_nlist(): data_accept: SSL/TLS handshake failed

曾几何时,PHP 土地出现正常错误:

Warning: ftp_nlist(): data_accept: SSL/TLS handshake failed in [path] on line 29

但问题是,“第 29 行”不是连接或登录,请注意它是如何引用 ftp_nlist() 函数的:

$ftp = ftp_ssl_connect($cred['host'], $cred['port'], 180);
if (!ftp_login($ftp, $cred['user'], $cred['pass'])) {die("Login Failed");}
ftp_pasv($ftp, true);

$files = ftp_nlist($ftp, '');

OpenSSL 在 phpinfo() 中编译并启用,如下所示: ftp_login() : SSL/TLS handshake failed

我看过的其他帖子似乎都提到了对我有用的 ftp_ssl_connect()ftp_login() 命令中的错误。当 ftp_login() returns 为真时,我可以检查什么?

或者...是否有任何日志可以获取有关问题的更多详细信息?

我正在使用 php 5.3.29。该代码在我的桌面上运行正常 (php 7),但我希望我不必将服务器升级到 7 就可以运行

2017 年 12 月 28 日更新: 升级到 5.6 已解决,看来 Martin 说对了。

ftp_nlist 打开一个数据连接。该连接也需要 TLS/SSL 握手。

由于控制连接握手成功,问题确实不能出在 PHP 中缺少 TLS/SSL 支持。问题都不会出在服务器和 PHP 无法找到一致同意的密码上。

当控制连接握手成功后TLS/SSL数据连接握手失败,这通常是因为客户端(PHP)没有重用来自控制连接的TLS/SSL会话数据连接(参见 Why is session reuse useful in FTPS?). Some servers do require that. PHP supports the reuse only since 5.6.26. See PHP Bug 70195。因此请确保至少使用 PHP 的那个版本。

虽然这个问题很老了,但是万一别人遇到这个问题:

如果您的 ftp_ssl_connectftp_login 工作正常但 ftp_nlistftp_putftp_fput 等功能不工作,问题可能是您的FTP 服务器正在使用 21 端口进行连接,但使用不同的端口范围进行数据传输,这解释了为什么您可以连接和登录但不能上传或下载数据,并且您需要允许 Out-going 连接到防火墙中的那些端口范围