我正忙着一个需要连接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?
...谢谢
约翰
答案 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());
?>
我希望这有助于某人......