官方文檔:
http://www.php.net/manual/zh/function.curl-setopt.php#10692
官方舉例:
<?php
curl_setopt($ch, CURLOPT_VERBOSE, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, '1');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, '1');
curl_setopt($ch, CURLOPT_CAINFO, getcwd().'/cert/ca.crt');
curl_setopt($ch, CURLOPT_SSLCERT, getcwd().'/cert/mycert.pem');
curl_setopt($ch, CURLOPT_SSLCERTPASSWD, 'password');
?>
由於業務原因,后台登陸需要使用SSL雙向認證,即web服務器有證書,瀏覽器客戶端也需要安裝證書
然后這樣的話,php接口文件就需要走443端口來訪問了
直接附上代碼:
/** * @name ssl Curl Post數據 * @param string $url 接收數據的api * @param string $vars 提交的數據 * @param int $second 要求程序必須在$second秒內完成,負責到$second秒后放到后台執行 * @return string or boolean 成功且對方有返回值則返回 */ function curl_post_ssl($url, $vars, $second=30,$aHeader=array()) { $ch = curl_init(); //curl_setopt($ch,CURLOPT_VERBOSE,'1'); curl_setopt($ch,CURLOPT_TIMEOUT,$second); curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch,CURLOPT_SSLCERTTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLCERT,'/data/cert/php.pem'); curl_setopt($ch,CURLOPT_SSLCERTPASSWD,'1234'); curl_setopt($ch,CURLOPT_SSLKEYTYPE,'PEM'); curl_setopt($ch,CURLOPT_SSLKEY,'/data/cert/php_private.pem'); if( count($aHeader) >= 1 ){ curl_setopt($ch, CURLOPT_HTTPHEADER, $aHeader); } curl_setopt($ch,CURLOPT_POST, 1); curl_setopt($ch,CURLOPT_POSTFIELDS,$vars); $data = curl_exec($ch); curl_close($ch); if($data) return $data; else return false; }
參數解釋:
CURLOPT_TIMEOUT:超時時間
CURLOPT_RETURNTRANSFER:是否要求返回數據
CURLOPT_SSL_VERIFYPEER:是否檢測服務器的證書是否由正規瀏覽器認證過的授權CA頒發的
CURLOPT_SSL_VERIFYHOST:是否檢測服務器的域名與證書上的是否一致
CURLOPT_SSLCERTTYPE:證書類型,"PEM" (default), "DER", and"ENG".
CURLOPT_SSLCERT:證書存放路徑
CURLOPT_SSLCERTPASSWD:證書密碼
CURLOPT_SSLKEYTYPE:私鑰類型,"PEM" (default), "DER", and"ENG".
CURLOPT_SSLKEY:私鑰存放路徑
由於php的curl只支持pem格式、der、eng格式,而之前生成的是p12的格式,所以需要轉換一下
PKCS#12 到 PEM 的轉換
openssl pkcs12 -nocerts -nodes -in cert.p12 -out private.pem 驗證 openssl pkcs12 -clcerts -nokeys -in cert.p12 -out cert.pem