【问题标题】:FTPS with CURL PHP带有 CURL PHP 的 FTPS
【发布时间】:2017-01-22 22:24:27
【问题描述】:

我正忙于需要连接到 FTPS 服务器的 curl php 库。

我有这个半工作...如果我连接到ftp://domain.com 那么它确实工作。如果我使用 tcpflow 观看服务器上的通讯,我会看到它使用 AUTH TLS 登录,并且所有通讯都是加密的。文件已上传,一切顺利..

我不确定的是尝试连接到 ftps://domain.com 是否有效?

我问的原因是,如果我在 curl 中将协议从 ftp 更改为 ftps,那么登录失败并且服务器(查看 tcpflow 通信)说登录失败:

191.101.002.204.00021-088.099.012.154.51630: 530 Please login with USER and PASS.

另外,当我在尝试连接到 ftps:// 时观看通讯时,我看不到客户端发出 AUTH TLS 命令,因为它使用普通 ftp://

我遇到的问题是,我们最终必须连接到的客户端的 FTP 服务器似乎不允许没有 ftps:// 协议的连接。

如果我使用 lftp 进行连接,我可以使用 ftps:// 进行连接,但是我必须禁用 ssl: 设置ftp://ssl-allow

如果我尝试使用 ftp:// 进行 lftp 连接,它只会挂在登录命令上...

我对 FTP 或 TLS / SSL 不是很熟悉,所以我不知道这是否可能是因为客户端的服务器没有正确设置证书..

这是我的 curl 代码的一部分,它适用于 ftp:// 但不适用于 ftps://

 // Works
 $url = "ftp://proxy.plettretreat.co.za/";
 // Does not work
 $url = "ftps://proxy.plettretreat.co.za/";
 $port = 990;
 $username = "ftpuser";
 $password = "pass";   

 $filename = "/test.php";
 $file = dirname(__FILE__)."/test.php";

 $c = curl_init();

 // check for successful connection
 if ( ! $c)
      throw new Exception( 'Could not initialize cURL.' );

 $options = array(
      CURLOPT_USERPWD        => $username.':'.$password,
      CURLOPT_SSL_VERIFYPEER =>     0,
      CURLOPT_SSL_VERIFYHOST =>     0,
      CURLOPT_RETURNTRANSFER =>     1,
      CURLOPT_BINARYTRANSFER =>     1,          
      CURLOPT_FTP_SSL        => CURLFTPSSL_ALL, // require SSL For both control and data connections
      CURLOPT_FTPSSLAUTH     => CURLFTPAUTH_TLS, // let cURL choose the FTP authentication method (either SSL or TLS)
      CURLOPT_UPLOAD         => true,
      CURLOPT_PORT           => $port,
      CURLOPT_TIMEOUT        => 30,
 );

我不确定的另一件事是我的客户端给了我一个 IP 地址来连接.. 可以在 ftps 中使用 IP 地址吗?我还以为证书主要是在证明一个域名?

tl;博士

1) 我可以使用 ftps://domain.com 来使用 CURL PHP 进行连接吗? 2)如果我可以在 curl 中使用 ftps://,那么如何让 curl 登录(发出 auth tls 命令)? 3) FTP 服务器是否可以仅使用 IP 地址使用 SSL/TLS?

谢谢...

约翰

【问题讨论】:

    标签: php curl ftps


    【解决方案1】:

    许多小时的挣扎让我找到了最终的答案。

    部分答案是客户端服务器和 FTP 服务器具有“过于”严格的防火墙规则来阻止被动端口。

    我收到以下错误:

    错误号:35;错误:SSL 连接错误。

    错误 35 是由防火墙规则引起的。一旦放松,错误就消失了,但请注意,如果客户端计算机经过 NAT,您也会看到此错误。如果是你需要设置 curl 选项:

    curl_setopt($c, CURLOPT_FTPPORT, '1.2.4.5' ); // 更改为您的实际 IP。

    这告诉 FTP 服务器在哪里打开它的数据通道(而不是尝试打开它到客户端服务器的内部地址)。

    无论如何,一旦设置了防火墙和 FTPPORT 选项,我就得到了:

    错误号:30;错误:绑定(端口 = 0)失败:无法分配请求的地址

    这个问题让我困惑了好一阵子,因为一切看起来都是正确的。

    我最终在这里和其他地方偶然发现了一些线程,其中讨论了旧版本的 Curl 使用 NSS 进行加密的问题。我检查了一下,我使用的是 libcurl 版本 7.19.7(大约 8 岁),果然它使用 NSS...

    我使用本指南更新了我的 Curl:https://www.digitalocean.com/community/questions/how-to-upgrade-curl-in-centos6。 这让我更新到使用 OpenSSL 的 libcurl 7.52.1,你瞧,我的应用开始工作了……

    因此,如果您在将 curl-ftp 连接到 FTPS 服务器时遇到问题,请检查 FTPPORT(被动 IP)(如果您已进行 NAT),请检查您的防火墙,但最重要的是,请检查您的 curl:

    <?php
    print print_r(curl_version());
    ?>
    

    我希望这对某人有所帮助..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-07
      • 2011-07-19
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多