PHP: ftp_login завершается с ошибкой «не удалось создать контекст SSL» - PullRequest
0 голосов
/ 11 марта 2011

Я пытаюсь загрузить файл на удаленный FTP-сервер (для которого требуется FTPES), используя PHP. Написанный мной скрипт работает локально, но на живом сервере ftp_login () возвращает false, и в журнале ошибок появляются следующие предупреждения:

PHP Warning:  ftp_login(): failed to create the SSL context [...]
PHP Warning:  ftp_login(): AUTH command ok; starting SSL connection. [...]

Я знаю, что данные для входа верны (поскольку идентичный код работает локально). Я могу успешно подключиться к FTP-серверу с живого сервера, используя curl в командной строке.

Сервер работает под управлением PHP 5.3.3 (Zend Server на CentOS). Из phpinfo я вижу, что команда PHP configure включает в себя -with-openssl = / usr / local / openssl-0.9.8o

Код просто такой:

$ftpConnection = ftp_ssl_connect('hostname');
if (!$ftpConnection) {
    echo "Failed to connect to FTP Site\n";
    return false;
}
if (!ftp_login($ftpConnection, 'xxxxx', 'xxxxx')) {
    echo "Failed to login to FTP site\n";
    return false;
}

Для справки, мой локальный ящик (где это работает нормально) работает под управлением PHP 5.3.3-1ubuntu9.3.

Кто-нибудь может указать мне правильное направление?

Редактировать : я заметил, что сертификат SSL для этого сервера на самом деле недействителен, так как имя хоста, к которому я подключаюсь, не соответствует общему имени в сертификате. Есть ли где-нибудь настройка PHP, которая контролирует, насколько строго или openSSL относится к ошибкам сертификата? Это может быть единственной проблемой.

1 Ответ

0 голосов
/ 11 марта 2011

В конце концов я решил эту проблему, изменив код для использования функций PHP cURL, поскольку я знал, что с этим можно нормально подключиться из командной строки. Вероятно, есть способ заставить это работать с функциями FTP, но на случай, если это кому-нибудь поможет, вот моя рабочая версия cURL:

$ch = curl_init();
curl_setopt_array($ch, array(
    CURLOPT_URL => 'ftp://username:password@hostname/path/to/file'
    CURLOPT_UPLOAD => 1,
    CURLOPT_INFILE => $fp,
    CURLOPT_INFILESIZE => $localFileSize,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_FTP_SSL => CURLFTPSSL_TRY,
    CURLOPT_VERBOSE => true
));

if (curl_exec($ch)) {
    curl_close($ch);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...