本文主要和大家分享PHP中Curl https跳過ssl認證報錯問題分析及解決辦法,希望能協助到大家。
function get($url = '', $cookie = ''){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //將curl_exec()擷取的資訊以檔案流的形式返回,而不是直接輸出。 curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 對認證認證來源的檢查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 從認證中檢查SSL密碼編譯演算法是否存在 curl_setopt($ch, CURLOPT_SSLVERSION, 2);//設定SSL協議版本號碼 if($cookie){ curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); curl_setopt ($ch, CURLOPT_REFERER,'https://wx.qq.com'); } curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $output = curl_exec($ch); if ( curl_errno($ch) ) return curl_error($ch); curl_close($ch); return $output;}
上面方法是使用者curl發起https請求的功能,CURLOPT_SSLVERSION項是規定ssl協議版本的,網上的代碼很多都說可以設定成1/2/3但是我測試的結果如下:
設定成1時在php 5.2.11版本中會有如下報錯:
“error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)”
此處報錯的原因是你的php中openssl的版本過低解決辦法是升級你的php到5.3.60(具體是高於哪個版本我沒有測試,應該只要openssl版本大於0.9.8版本就可以的)
設定成2時會有如下報錯:
Linux環境報錯:”SSL version range is not valid.”
Windows環境報錯:”OpenSSL was built without SSLv2 support”
這個應該比較容易理解就是SSL協議的版本號碼已經無效
設定成3時會有如下報錯:
Linux環境報錯:”Encountered end of file”.
Windows環境報錯:”Unknown SSL protocol error in connection to login.wx.qq.com:443 ”
出現這個錯誤的原因網上查資料之後我認為是由於SSLV2和SSLV3存在安全性漏洞所以已經不再使用SSLV2和SSLV3協議版本,所以我們設定成3時會出現錯誤。
function get($url = '', $cookie = ''){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //將curl_exec()擷取的資訊以檔案流的形式返回,而不是直接輸出。 curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 對認證認證來源的檢查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 從認證中檢查SSL密碼編譯演算法是否存在 curl_setopt($ch, CURLOPT_SSLVERSION, 2);//設定SSL協議版本號碼 if($cookie){ curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); curl_setopt ($ch, CURLOPT_REFERER,'https://wx.qq.com'); } curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); $output = curl_exec($ch); if ( curl_errno($ch) ) return curl_error($ch); curl_close($ch); return $output;}
上面方法是使用者curl發起https請求的功能,CURLOPT_SSLVERSION項是規定ssl協議版本的,網上的代碼很多都說可以設定成1/2/3但是我測試的結果如下:
設定成1時在php 5.2.11版本中會有如下報錯:
“error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)”
此處報錯的原因是你的php中openssl的版本過低解決辦法是升級你的php到5.3.60(具體是高於哪個版本我沒有測試,應該只要openssl版本大於0.9.8版本就可以的)
設定成2時會有如下報錯:
Linux環境報錯:”SSL version range is not valid.”
Windows環境報錯:”OpenSSL was built without SSLv2 support”
這個應該比較容易理解就是SSL協議的版本號碼已經無效
設定成3時會有如下報錯:
Linux環境報錯:”Encountered end of file”.
Windows環境報錯:”Unknown SSL protocol error in connection to login.wx.qq.com:443 ”
出現這個錯誤的原因網上查資料之後我認為是由於SSLV2和SSLV3存在安全性漏洞所以已經不再使用SSLV2和SSLV3協議版本,所以我們設定成3時會出現錯誤。