首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带CURL PHP的FTPS

带CURL PHP的FTPS
EN

Stack Overflow用户
提问于 2017-01-22 22:24:27
回答 1查看 2.8K关注 0票数 1

我忙于使用curl库,它需要连接到FTPS服务器。

我有个半工作的..。如果我连接到ftp://domain.com,那么它就能工作。如果我用tcpflow查看服务器上的通信,我会看到它使用AUTH登录,并且所有的通信都是加密的。文件被上传了所以一切都很好。

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

我之所以问这个问题,是因为如果我将协议从ftp改为ftp,则登录失败,服务器(查看tcpflow通信)表示登录失败:

代码语言:javascript
复制
191.101.002.204.00021-088.099.012.154.51630: 530 Please login with USER and PASS.

另外,当我试图连接到ftps://时,我没有看到客户端发出AUTH命令,就像普通ftp://一样。

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

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

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

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

下面是我的一部分curl代码,它可以处理ftp://,而不是ftps://

代码语言:javascript
复制
 // 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地址来连接。IP地址可以用于ftps吗?我会认为证书主要是证明一个域名?

tl;dr

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

谢谢..。

约翰

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-27 16:48:21

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

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

我得到了以下错误:

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

错误35是因为防火墙规则。一旦放松了,错误就消失了,但是注意,如果客户端机器是NAT‘’ed的话,您也会看到这个错误。如果是,则需要设置curl选项:

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

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

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

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

这件事使我困惑了一段时间,因为一切看起来都是正确的。

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

我使用以下指南更新了我的Curl:https://www.digitalocean.com/community/questions/how-to-upgrade-curl-in-centos6。这更新了我的libcurl 7.52.1,它使用OpenSSL和lo,然后,我的应用程序开始工作.

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

代码语言:javascript
复制
<?php
print print_r(curl_version());
?>

我希望这能帮到某人..。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41796808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档