0

PHP を使用してリモート FTP サーバー (FTPES が必要) にファイルをアップロードしようとしています。私が書いたスクリプトはローカルで動作しますが、ライブ サーバーでは ftp_login() が false を返し、次の警告がエラー ログに表示されます。

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

ログインの詳細が正しいことはわかっています (同一のコードがローカルで動作するため)。コマンドラインでcurlを使用して、ライブサーバーからFTPサーバーに正常に接続できます。

サーバーは PHP 5.3.3 (CentOS 上の Zend サーバー) を実行しています。phpinfo から、PHP 構成コマンドに -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証明書が実際には有効ではないことに気付きました。それまたは openSSL が証明書エラーに関してどれほど厳密かを制御する PHP 設定はどこかにありますか? それが唯一の問題かもしれません。

4

1 に答える 1

1

最終的に、代わりに 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);
}
于 2011-03-11T19:10:21.217 に答える