系統訪問由http變為https,先申請了CA證書,然后win下瀏覽器訪問時沒問題的,但是linux下通過curl的方式訪問就報錯:
curl:(51) SSLcertificate subject name '*.xxxxxx.com does not match target host name '10.10.xxx.xxx'。
意思是SSL證書使用者名稱與目標主機名不匹配。
百度良久,基本修改方式有兩種,
方法一:設定為不驗證證書和host ,是一段php的代碼,如下寫法:
$url = 'https://www.jb51.net';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 1);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // https請求 不驗證證書
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);// https請求 不驗證hosts
$data = curl_exec($curl); curl_close($curl); var_dump($data);
方法二:設定一個正確的證書,如下寫法:
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500); // 為保證第三方服務器與微信服務器之間數據傳輸的安全性,所有微信接口采用https方式調用,必須使用下面2行代碼打開ssl安全校驗。 // 如果在部署過程中代碼在此處驗證失敗,請到 http://curl.haxx.se/ca/cacert.pem 下載新的證書判別文件。
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl,CURLOPT_CAINFO,dirname(__FILE__).'/cacert.pem');//這是根據http://curl.haxx.se/ca/cacert.pem 下載的證書,添加這句話之后就運行正常了
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
但是我們的這個是自己openssl自建CA簽發的證書,因此還有另一種方式,將證書放在linux下,訪問的時候加上此證書,驗證就能通過了。
我們最初生生成的證書格式為pfx,若服務端要求客戶端認證,需要將pfx證書轉換成pem格式。
openssl pkcs12 -clcerts -nokeys -in cert.pfx -out client.pem #客戶端個人證書的公鑰
openssl pkcs12 -nocerts -nodes -in cert.pfx -out key.pem #客戶端個人證書的私鑰
也可以轉換為公鑰與私鑰合二為一的文件
openssl pkcs12 -in cert.pfx -out all.pem -nodes #客戶端公鑰與私鑰,一起存在all.pem中
轉換完成之后,將pem格式的證書放在/etc/pki/tls/certs下。
訪問時的方式為: curl -k --cert www.pem https://xxxxxxxxxxx
使用-k是不對服務器的證書進行檢查,這樣就不必關心服務器證書的導出問題了。