【问题标题】:ftp_nlist(): data_accept: SSL/TLS handshake failedftp_nlist(): data_accept: SSL/TLS 握手失败
【发布时间】:2017-12-04 14:09:51
【问题描述】:

曾几何时,PHP 领域有一个正常的错误:

警告:ftp_nlist(): data_accept: SSL/TLS 握手在第 29 行的 [path] 中失败

但这里有一个问题,“第 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() 返回 true 时我可以检查什么?

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

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

2017 年 12 月 28 日更新: 升级到 5.6 解决了,所以看起来 Martin 是正确的。

【问题讨论】:

    标签: php ssl ftp ftps


    【解决方案1】:

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

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

    【讨论】:

    • 在这种情况下,您通常会收到“连接被拒绝”或类似错误。因为防火墙不应该让握手开始。但是好吧,它可能会发生。
    • 是的,但在我们的例子中,FTP 服务器允许连接和登录,但不允许数据传输,因为它使用不同的端口
    • 当然,我明白这一点。尝试打开数据连接时,我希望“连接被拒绝”。
    【解决方案2】:

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

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

    当控制连接握手成功后数据连接上的 TLS/SSL 握手失败时,通常是因为客户端 (PHP) 没有从数据连接上的控制连接重用 TLS/SSL 会话(请参阅Why is session reuse useful in FTPS?)。有些服务器确实需要。 PHP 仅从 5.6.26 开始支持重用。见PHP Bug 70195。因此,请确保您至少使用该版本的 PHP。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      • 2018-07-28
      • 2019-12-16
      • 2015-01-04
      • 2021-02-02
      • 2012-10-11
      相关资源
      最近更新 更多