天天看點

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

環境配置

系統環境 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程式中使用

$matches = parse_url($url);

$host = $matches['host'];

$path = $matches['path'] ? $matches['path'].($matches['query'] ? '?'.$matches['query'] : '') : '/';

        $transports = '';

        if($matches['scheme'] == 'https') { //判斷是否使用HTTPS

            $transports = 'ssl://';  //如使用HTTPS則使用SSL協定

            $port = !empty($matches['port']) ? $matches['port'] : 443; //如使用HTTPS端口使用443

        } else {

            $transports = 'tcp://'; //如沒有使用HTTPS則使用tcp協定

            $port = !empty($matches['port']) ? $matches['port'] : 80;//如沒有使用HTTPS則使用80端口

        }

$fp = @fsockopen(($transports . $host), $port, $errno, $errstr, $timeout);

複制代碼

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

<?php exit;?>05-12 20:40:12 | 2 | fsockopen(): SSL operation failed with code 1. OpenSSL Error messages:

error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed | ../client.class.php | 395

<?php exit;?>05-12 20:40:12 | 2 | fsockopen(): Failed to enable crypto | ../client.class.php | 395

<?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以前的版本不存在此問題!

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

如何聯系我:【萬裡虎】www.bravetiger.cn

【QQ】3396726884 (咨詢問題100元起,幫助解決問題500元起)

【部落格】http://www.cnblogs.com/kenshinobiy/