我知道遲到的迴應,但我也一直在爲此付出努力,以下兩段代碼最終爲我工作,所以即使它爲時已晚,也許會幫助其他人。在我的情況下,我只需要使用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的,timemout限制,同時也nginx的撥弄,像我一樣在我的情況下與一個麻煩的Plesk安裝,如果文件很大,傳輸速度很慢。
OMG,我幾乎放棄了這一點。我非常感謝你的回答。 – Erik
哇,很高興我可以幫忙!真的沒有想到你會回來,謝謝接受。 –