FTPS с переполнением стека CURL

Я занят с библиотекой 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-адресом?

Спасибо…

Джон

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.
Это обновило меня до libcurl 7.52.1, который использует OpenSSL и вот, мое приложение начало работать …

Итак, если у вас возникли проблемы с подключением curl-ftp к серверу FTPS, проверьте FTPPORT (пассивный IP), если вы используете NAT, проверьте брандмауэр, но самое главное, проверьте свой curl:

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

Я надеюсь, что это помогает кому-то..

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]