使用CURL PHP

时间:2017-01-22 22:24:28

标签: php curl ftps

我正忙着一个需要连接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所以我不知道它是否可能是因为客户端的服务器没有正确设置证书。

以下是我的卷曲代码的一部分,它适用于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?

...谢谢

约翰

1 个答案:

答案 0 :(得分:0)

许多小时的挣扎让我得到了最终的回答。

部分答案是客户端服务器和FTP服务器过度使用了#34;严格的防火墙规则阻止被动端口。

我收到以下错误:

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

错误35是因为防火墙规则。一旦放松了那个错误消失了,但作为一个注释,如果客户端机器是NAT,你也会看到这个错误。如果是,则需要设置curl选项:

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

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

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

错误号码:30;错误:bind(port = 0)失败:无法分配请求的地址

这一点令我感到困惑,因为一切看起来都是正确的。

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

我使用本指南更新了我的卷曲:https://www.digitalocean.com/community/questions/how-to-upgrade-curl-in-centos6。 这让我更新了使用OpenSSL的libcurl 7.52.1并且看到了,我的应用程序开始工作......

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

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

我希望这有助于某人......