關(guān)于PHP cafile的設(shè)置
PHP cafile是一項(xiàng)配置,用于指定服務(wù)器訪問(wèn)HTTPS時(shí)驗(yàn)證SSL證書(shū)有效性所用的根證書(shū)列表。在進(jìn)行網(wǎng)絡(luò)請(qǐng)求時(shí),我們需要保證請(qǐng)求的網(wǎng)站的證書(shū)是被一個(gè)可信的證書(shū)頒發(fā)機(jī)構(gòu)信任的,否則可能會(huì)遭到中間人(Man-in-the-middle)攻擊,導(dǎo)致數(shù)據(jù)泄露或篡改等風(fēng)險(xiǎn)。
在PHP中,默認(rèn)的cafile路徑是在操作系統(tǒng)級(jí)別的ca證書(shū)路徑中。例如,在CentOS6系統(tǒng)中,默認(rèn)的ca證書(shū)路徑是/etc/pki/tls/certs/ca-bundle.crt
curl_setopt($ch, CURLOPT_CAINFO, '/etc/pki/tls/certs/ca-bundle.crt');
如果我們的操作系統(tǒng)沒(méi)有特地安裝HTTPS證書(shū),我們需要手動(dòng)的設(shè)置PHP的cafile。例如,我們可以在 curl_init() 函數(shù)中設(shè)置 CURLOPT_CAINFO 參數(shù),將證書(shū)地址路徑指向我們的cafile。
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER,true);
curl_setopt($curl, CURLOPT_CAINFO, __DIR__.'/cacert.pem'); // 將證書(shū)地址路徑指向我們的cafile
$result=curl_exec($curl);
curl_close($curl);
$result=json_decode($result,true);
注意:進(jìn)行HTTPS請(qǐng)求時(shí)過(guò)程可能很慢,根據(jù)curl_setopt參數(shù),應(yīng)該增加ssl超時(shí)時(shí)間(或者忽略SSL校驗(yàn),不過(guò)不提倡這種寫(xiě)法,安全性極低)
同時(shí),我們也可以使用內(nèi)置函數(shù) openssl_get_cert_locations() 獲取服務(wù)器端證書(shū)的路徑。
var_dump(openssl_get_cert_locations());
//array(8) {
// ["default_cert_file"]=>string(21) "/usr/local/etc/openssl/cert.pem"
// ["default_cert_file_env"]=>string(13) "SSL_CERT_FILE"
// ["default_cert_dir"]=>string(22) "/usr/local/etc/openssl"
// ["default_cert_dir_env"]=>string(12) "SSL_CERT_DIR"
// ["default_private_dir"]=>string(24) "/usr/local/etc/openssl/private"
// ["default_default_cert_area"]=>string(12) "/usr/local/ssl"
// ["ini_cafile"]=>string(27) "/usr/local/etc/openssl/cacert.pem"
// ["ini_capath"]=>string(0) ""
//}
這個(gè)函數(shù)返回一個(gè)包含了多種證書(shū)路徑的數(shù)組,在實(shí)際應(yīng)用中,我們可以使用這個(gè)函數(shù)的結(jié)果替代硬編碼的cafile路徑。
需要注意的是,本文說(shuō)明的所有內(nèi)容只在使用curl進(jìn)行HTTPS請(qǐng)求的時(shí)候指定cafile是有用,如果你使用其他的客戶端程序或函數(shù)庫(kù),需要查看對(duì)應(yīng)的文檔確認(rèn)如何指定cafile。
在實(shí)際應(yīng)用中,HTTPS請(qǐng)求已經(jīng)成為非常普遍的訪問(wèn)方式。掌握PHP cafile的設(shè)置方式能夠讓我們保護(hù)自己的數(shù)據(jù)安全!