国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP CURL訪問HTTPS使用詳解

2024-05-04 21:49:36
字體:
來源:轉載
供稿:網友

如果你直接使用PHP CURL函數來抓取http內容可能沒有任何問題了,但是如果你要正抓取的是https文件才會發現本文章幫你解決了一個大難題了,下面我們來看看具體操作過程.

三年前寫過一篇《一個簡陋的支持HTTPS的PHP CURL封裝函數》,當時只是知其然不知其所以然,今天來詳細梳理一下.

https服務器post數據,代碼如下:

  1. function curlPost($url$data$timeout = 30) 
  2.     $ssl = substr($url, 0, 8) == "https://" ? TRUE : FALSE; 
  3.     $ch = curl_init(); 
  4.     $opt = array
  5.             CURLOPT_URL     => $url
  6.             CURLOPT_POST    => 1, 
  7.             CURLOPT_HEADER  => 0, 
  8.             CURLOPT_POSTFIELDS      => (array)$data
  9.             CURLOPT_RETURNTRANSFER  => 1, 
  10.             CURLOPT_TIMEOUT         => $timeout
  11.             ); 
  12.     if ($ssl
  13.     { 
  14.         $opt[CURLOPT_SSL_VERIFYHOST] = 1; 
  15.         $opt[CURLOPT_SSL_VERIFYPEER] = FALSE; 
  16.     } 
  17.     curl_setopt_array($ch$opt); 
  18.     $data = curl_exec($ch); 
  19.     curl_close($ch); 
  20.     return $data
  21. $data = curlPost('http://m.survivalescaperooms.com'array('p'=>'hello')); 
  22. echo ($data); 

其實這是告訴服務器不進行SSL認證,并不是真的走HTTPS,如果要真正使用HTTPS,那么需要提供CA證書.

上面關于SSL部分按照如下設置:

01.CURLOPT_SSL_VERIFYPEER 設置為 true,說明進行SSL證書認證  

02.CURLOPT_SSL_VERIFYHOST 設置為 2,說明進行嚴格認證  

03.CURLOPT_CAINFO 設置為證書的路徑 

為方便說明,先上代碼吧~ 這是今天重新封裝的一個函數,代碼如下:

  1. /**  
  2.  * curl POST  
  3.  *  
  4.  * @param   string  url  
  5.  * @param   array   數據  
  6.  * @param   int     請求超時時間  
  7.  * @param   bool    HTTPS時是否進行嚴格認證  
  8.  * @return  string  
  9.  */   
  10. function curlPost($url$data = array(), $timeout = 30, $CA = true){     
  11.    
  12.     $cacert = getcwd() . '/cacert.pem'//CA根證書   
  13.     $SSL = substr($url, 0, 8) == "https://" ? true : false;   
  14.        
  15.     $ch = curl_init();   
  16.     curl_setopt($ch, CURLOPT_URL, $url);   
  17.     curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);   
  18.     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout-2);   
  19.     if ($SSL && $CA) {   
  20.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   // 只信任CA頒布的證書   
  21.         curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根證書(用來驗證的網站證書是否是CA頒布)   
  22.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 檢查證書中是否設置域名,并且是否與提供的主機名匹配   
  23.     } else if ($SSL && !$CA) {   
  24.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何證書   
  25.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 檢查證書中是否設置域名   
  26.     }   
  27.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);   
  28.     curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); //避免data數據過長問題   
  29.     curl_setopt($ch, CURLOPT_POST, true);   
  30.     curl_setopt($ch, CURLOPT_POSTFIELDS, $data);   
  31.     //curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); //data with URLEncode  //開源代碼Vevb.com 
  32.    
  33.     $ret = curl_exec($ch);   
  34.     //var_dump(curl_error($ch));  //查看報錯信息   
  35.    
  36.     curl_close($ch);   
  37.     return $ret;     

如果URL地址是https打頭,那就走SSL,否則就走普通的HTTP協議,是否走HTTPS的話就安全了嗎?其實SSL也有不同的驗證程度.

例如需不需要驗證證書中的公用名呢?(BTW:公用名(Common Name)一般來講就是填寫你將要申請SSL證書的域名(domain)或子域名(sub domain).)

需要驗證主機名嗎?

是任何證書都信任呢還是只信任CA頒布的呢?如果網站SSL證書買的是CA的,通常比較貴,那么訪問時可以使用比較嚴格的認證,即代碼如下:

  1. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);   // 只信任CA頒布的證書   
  2. curl_setopt($ch, CURLOPT_CAINFO, $cacert); // CA根證書(用來驗證的網站證書是否是CA頒布)   
  3. curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 檢查證書中是否設置域名,并且是否與提供的主機名匹配  

如果網站的證書是自己生成的,或者是網上的小機構申請的,那么訪問時如果使用嚴格認證則不會通過,直接返回false,對了,返回false時可以打印curl_error($ch)查看具體錯誤信息,此時可以根據情況通過降低驗證程度來保證正常訪問,代碼如下:

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1);

檢查證書中是否設置域名,為0也可以,就是連域名存在與否都不驗證了,平時我們使用瀏覽器訪問各個https網站時,有時會遇到證書不受信的提示,其實就是因為這些網站的證書不是正規CA機構頒布的.

市面上各種瀏覽器中都內置了CA根證書列表信息,訪問有CA頒布證書的網站時,會根據根證書驗證這些網站的證書,所以就不會有這個提示了.

關于CA根證書文件,其實就是包含了各個主要CA機構的公鑰證書,用來驗證網站的證書是否是這些機構頒發的.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 青川县| 宣武区| 读书| 扎囊县| 宁夏| 瓦房店市| 山西省| 育儿| 贺兰县| 中卫市| 新宁县| 内乡县| 兴城市| 阳曲县| 车致| 云龙县| 镇远县| 太康县| 闻喜县| 祥云县| 三江| 金门县| 罗平县| 利辛县| 麟游县| 白朗县| 徐汇区| 祁东县| 南充市| 华池县| 宣武区| 乌鲁木齐县| 马关县| 泽库县| 长顺县| 项城市| 酒泉市| 阿荣旗| 郴州市| 枣强县| 阳江市|