Мне сложно настроить соединение с FTPS.
Я должен подключиться с использованием SSL / TLS и AUTH (явный стандарт). У меня есть адрес сервера и порт (: 60000) и открытый ключ от владельца сервера, а также собственный сертификат.
После googling вокруг я думаю, что curl – мой лучший вариант, но я действительно не знаю, какие варианты завитка использовать.
У кого-нибудь есть рабочий пример по фрагменту, который соединяет и загружает / загружает файл на такой FTPS?
На этой странице есть некоторая информация http://php.net/manual/en/function.curl-setopt.php Например, dong тоже думает, но используя имя пользователя / пароль
$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);
Любые идеи, как использовать сертификат?
Заранее спасибо!
Поздний ответ, который я знаю, но я также боролся с этим, и следующие два блока кода оказались для меня работающими, поэтому, даже если вам слишком поздно, может быть, это поможет другим. В моем случае мне приходилось проверять только одноранговое соединение с сертификатом CA, поэтому, если вам нужно проверить себя с партнером (помимо пользователя / пароля), вам может понадобиться интегрировать третий блок кода ниже.
Загрузка (только с сертификатом CA)
$ftp_server = 'ftps://YOUR-SERVER-NAME/'; $ftp_user = 'FTP-USER-NAME'; $ftp_password = 'FTP-PASSWORD'; $ftp_certificate = 'PATH TO CA CERT'; // ...eg/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'; // ...eg/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, если файлы большие, а переводы медленные.