Подключение к FTPS с использованием PHP и сертификат в качестве аутентификации
У меня проблемы с установкой соединения с FTPS.
Я должен подключиться с использованием SSL/TLS и AUTH (явный стандарт). У меня есть адрес сервера и порт (:60000) и открытый ключ от владельца сервера, а также собственный сертификат.
После поисков я думаю, что curl - мой лучший вариант, но я не знаю, какие варианты curl использовать.
У кого-нибудь есть рабочий пример фрагмента, который подключает и загружает / загружает файл на такой FTPS?
На этой странице есть некоторая информация http://php.net/manual/en/function.curl-setopt.php Например, те же мысли, но с использованием имени пользователя / пароля
$username = 'username';
$password = 'password';
$url = 'example.com';
$ftp_server = "ftp://" . $username . ":" . $password . "@" . $url;
echo "Starting CURL.\n";
$ch = curl_init();
echo "Set CURL URL.\n";
//curl FTP
curl_setopt($ch, CURLOPT_URL, $ftp_server);
//For Debugging
//curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
//SSL Settings
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_TRY);
//List FTP files and directories
curl_setopt($ch, CURLOPT_FTPLISTONLY, TRUE);
//Output to curl_exec
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
echo "Executing CURL.\n";
$output = curl_exec($ch);
curl_close($ch);
echo "Closing CURL.\n";
echo $output . "\n";
$files = explode("\n", $output);
print_r($files);
Есть идеи, как использовать сертификат вместо?
Заранее спасибо!
1 ответ
Поздний ответ, я знаю, но я также боролся с этим, и следующие два блока кода оказались для меня полезными, поэтому, даже если для вас уже слишком поздно, возможно, это поможет другим. В моем случае мне нужно было только проверить одноранговый узел с помощью сертификата CA, поэтому, если вам нужно подтвердить себя с помощью однорангового узла (конечно, помимо пользователя / прохода), вам может понадобиться интегрировать третий блок кода ниже.
Загрузка (только с сертификатом CA)
$ftp_server = 'ftps://YOUR-SERVER-NAME/';
$ftp_user = 'FTP-USER-NAME';
$ftp_password = 'FTP-PASSWORD';
$ftp_certificate = 'PATH TO CA CERT';
// ...e.g./var/www/certs/ssl-certificate.pub.crt
$source_file = 'REMOTE-FILE-PATH';
$destination_file = 'LOCAL-FILE-PATH';
$file = fopen($destination_file, 'w');
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_URL, $ftp_server . $source_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $ftp_user . ':' . $ftp_password);
curl_setopt($ch, CURLOPT_TIMEOUT, 400);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 400);
curl_setopt($ch, CURLOPT_FILE, $file);
//SSL
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, $ftp_certificate);
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_SSL);
curl_exec($ch);
$error_no = curl_errno($ch);
$error_msg = curl_error($ch);
curl_close ($ch);
if ($error_no == 0) {
$msg = 'File downloaded succesfully.';
} else {
$msg = 'File download error:' . $error_msg . ' | ' . $error_no;
}
fclose($file);
echo $msg;
Загрузка (только с сертификатом CA)
$ftp_server = 'ftps://YOUR-SERVER-NAME/';
$ftp_user = 'FTP-USER-NAME';
$ftp_password = 'FTP-PASSWORD';
$ftp_certificate = 'PATH TO CA CERT';
// ...e.g./var/www/certs/ssl-certificate.pub.crt
$source_file = 'LOCAL-FILE-PATH';
$destination_file = 'REMOTE-FILE-PATH';
$file = fopen($source_file, 'r');
$ch = curl_init();
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
curl_setopt($ch, CURLOPT_URL, $ftp_server . $destination_file);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, $ftp_user . ':' . $ftp_password);
curl_setopt($ch, CURLOPT_TIMEOUT, 400);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 400);
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $file);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($source_file));
//SSL stuff
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_CAINFO, $ftp_certificate);
curl_setopt($ch, CURLOPT_FTP_SSL, CURLFTPSSL_ALL);
curl_setopt($ch, CURLOPT_FTPSSLAUTH, CURLFTPAUTH_SSL);
$upload_result = curl_exec($ch);
$upload_info = curl_getinfo($ch);
$error_no = curl_errno($ch);
$error_msg = curl_error($ch);
curl_close ($ch);
if ($error_no == 0) {
$msg = 'File uploaded succesfully.';
} else {
$msg = 'File upload error:' . $error_msg . ' | ' . $error_no;
}
fclose($file);
echo $msg . '(' . filesize($source_file) . ')';
Вы можете проверить код ответа, например, так:
if ($upload_info['http_code'] == '226') {...}
Чтобы добавить открытый / закрытый ключи (добавьте это раньше curl_exec
)
// A private SSL key.
// If your key file has a password, you will need to set
// this with CURLOPT_SSLKEYPASSWD
curl_setopt($ch, CURLOPT_SSLKEY, $keyFile);
// A PEM formatted certificate- with CURLOPT_SSLCERTTYPE
// you could also use DER or ENG formats
curl_setopt($ch, CURLOPT_SSLCERT, $certFile);
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $certPass);
Конечно, вам, возможно, придется поработать с ограничениями по времени ожидания в PHP, Apache, а также nginx, как я делал в моем случае с проблемной установкой Plesk, если файлы большие и передачи медленные.