OPENSSL問題,使用fsockopen()函式提示錯誤

suboysugar發表於2017-08-27

環境配置

系統環境 CentOS7.2
WDCP v3.2.2 lanmp

PHP 多版本 指定使用5.6

OpenSSL 1.0.2h  3 May 2016

php.ini相關設定
allow_url_fopen = On
allow_url_include = On
openssl.cafile= /www/wdlinux/nginx/conf/cert/cacert.pem  (後來下載OPENSSL證照放上的)

問題描述

PHP程式中使用

  1. $matches = parse_url($url);
  2. $host = $matches[`host`];
  3. $path = $matches[`path`] ? $matches[`path`].($matches[`query`] ? `?`.$matches[`query`] : “) : `/`;
  4.         $transports = “;
  5.         if($matches[`scheme`] == `https`) { //判斷是否使用HTTPS
  6.             $transports = `ssl://`;  //如使用HTTPS則使用SSL協議
  7.             $port = !empty($matches[`port`]) ? $matches[`port`] : 443; //如使用HTTPS埠使用443
  8.         } else {
  9.             $transports = `tcp://`; //如沒有使用HTTPS則使用tcp協議
  10.             $port = !empty($matches[`port`]) ? $matches[`port`] : 80;//如沒有使用HTTPS則使用80埠
  11.         }
  12. $fp = @fsockopen(($transports . $host), $port, $errno, $errstr, $timeout);

複製程式碼

其中此PHP檔案執行無效果,生成error_log資訊如下

  1. <?php exit;?>05-12 20:40:12 | 2 | fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:
  2. error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed | ../client.class.php | 395
  3. <?php exit;?>05-12 20:40:12 | 2 | fsockopen(): Failed to enable crypto | ../client.class.php | 395
  4. <?php exit;?>05-12 20:40:12 | 2 | fsockopen(): unable to connect to ssl://www.xxx.net:443 (Unknown error) | p../client.class.php | 395

複製程式碼

395行就是以上程式碼中的 $fp = @fsockopen(($transports . $host), $port, $errno, $errstr, $timeout);

百度很多資料,沒找到相關PHP報錯的資料,找到一些E文網站,大約是說沒有下載openssl根證照,於是更具資料提示下載OpenSSL根證照,並在php.ini設定OPENSSL證照位置,還是不能正常執行,報以上錯誤,估計是OPENSSL環境配置的問題,請admin指點

 

我百度了一些錯誤關鍵詞
OpenSSL Error messages:error:14090086
SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 
Failed to enable crypto
好像都是說關於openssl根證照的問題,大神能幫看下如何解決嗎

 

經過三天的摸索和查詢資料,現在我已確定問題所在
此問題和wdcp無關,和php版本以及openssl相關

主要是因為php在5.6版本(包含5.6)以後的所有版本中如使用fsockopen() 或file_get_content()函式獲取https站點的資訊,OPENSSL會驗證對方站點的SSL證照頒發機構是否可信,如果沒有下載openssl根證照並在php.ini中設定openssl根證照路徑,就會造成無法驗證對方網站SSL證照是否可信,就無法使用上述兩個函式獲取到內容同時生成PHP警告資訊,php5.6以前的老版本中此驗證功能是沒有開啟或者說是沒有作用的。所以php5.6以前的版本不存在此問題!
OpenSSL Error messages:error:14090086
SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 
Failed to enable crypto

特在此說明原因,同時希望我這兩天的折騰對以後遇到同樣問題的朋友有所幫助少走彎路

 

如何聯絡我:【萬里虎】www.bravetiger.cn
【QQ】3396726884 (諮詢問題100元起,幫助解決問題500元起)
【部落格】http://www.cnblogs.com/kenshinobiy/


相關文章