Я занят с библиотекой curl php, которая должна подключаться к серверу FTPS.
У меня это полу работает … Если я подключусь к ftp://domain.com тогда это работает. Если я смотрю сообщения на сервере с помощью tcpflow, я вижу, что он входит в систему с помощью AUTH TLS, и все сообщения зашифрованы. Файл загружен, так что все хорошо ..
В чем я не уверен, так ли это, если он действительно пытается подключиться вместо ftps: //domain.com?
Причина, по которой я спрашиваю, состоит в том, что если я изменю протокол с ftp на ftps в curl, то произойдет сбой входа в систему, и сервер (наблюдая за связью 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-разрешительный нет
Если я пытаюсь установить соединение lftp с помощью ftp: //, оно просто зависает при входе в систему …
Я не очень опытен с 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-адрес для подключения. Можно ли использовать IP-адрес в ftps? Я бы подумал, что сертификаты в основном удостоверяют доменное имя?
ТЛ; др
1) Могу ли я использовать ftps: //domain.com для подключения с использованием CURL PHP?
2) Если я могу использовать ftps: // в curl, то как мне заставить curl войти в систему (выполнить команду auth tls)?
3) Может ли FTP-сервер использовать SSL / TLS только с IP-адресом?
Спасибо…
Джон
Много-много часов борьбы привели меня к окончательному ответу.
Частично ответ состоял в том, что клиентский сервер и 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.
Это обновило меня до libcurl 7.52.1, который использует OpenSSL и вот, мое приложение начало работать …
Итак, если у вас возникли проблемы с подключением curl-ftp к серверу FTPS, проверьте FTPPORT (пассивный IP), если вы используете NAT, проверьте брандмауэр, но самое главное, проверьте свой curl:
<?php
print print_r(curl_version());
?>
Я надеюсь, что это помогает кому-то..
Других решений пока нет …