PHP使用CURL访问HTTPS,返回错误35 SSL connect error

项目需要使用微信接口,发生过几次透过php的curl_exec访问接口返回false的情况,
做了许多尝试,爬了各种解决办法,总结下解决方案,首先为了简化问题写了简单的调用代码如下,
 

<?php
        echo "</pre>";
        $url="https://api.weixin.qq.com/sns/jscode2session?appid=xxxxxxxx&js_code=xxxxx&grant_type=authorization_code";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        $tmp = curl_exec($ch);
        //$tmp返回false
        if(!$tmp)
        {
                var_dump(curl_errno($ch));
                var_dump(curl_error($ch));
                var_dump(curl_getinfo($ch));
        }




        $app_user = json_decode($tmp,true);
        curl_close($ch);
        var_dump($tmp);
        var_dump($app_user);
        echo "</pre>";die;
?>

因为Centos默认使用nss的ssl协议,可能会遇到证书问题(例如windows访问某些https地址会出现不安全的警告),因此加上不验证https的网址安全性,
另外也爬到有网友说要加上协议版本  curl_setopt($ch, CURLOPT_SSLVERSION, 3); 

<?php
        echo "</pre>";
        $url="https://api.weixin.qq.com/sns/jscode2session?appid=xxxxxxxx&js_code=xxxxx&grant_type=authorization_code";
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

        //-----增加下面代码------
        //关闭SSL证书验证
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER , false);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,false);
        //指定HTTL协议版本,因为访问的是htts所以应该没有任何作用
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
        //指定SSL的协议版本,但是因为我后面替换成Openssl之后,会出问题因此仅记录下
        //curl_setopt($ch, CURLOPT_SSLVERSION, 3);
        //----------------------

        $tmp = curl_exec($ch);

        if(!$tmp)
        {
                var_dump(curl_errno($ch));
                var_dump(curl_error($ch));
                var_dump(curl_getinfo($ch));
        }




        $app_user = json_decode($tmp,true);
        curl_close($ch);
        var_dump($tmp);
        var_dump($app_user);
        echo "</pre>";die;
?>

当然也尝试各种更新
 

$ yum upgrade nss 

如此一度解决,这两天又发现不好使了,系统中使用curl命令执行正常,但是使用php的curl_exec返回就是false
最终定位问题还是出在php的curl扩展上,默认情况下curl使用的是nss

尝试替换成与CURL命令一样使用Openssl
首先需要准备环境,因为我的PHP是懒惰使用yum安装,因此只想单独找一个版本相同的源码,只编译curl扩展来替代
 

$ yum groupinstall development
$ yum install php-devel

 

//首先先备份原来的CURL
$ cd /usr/lib64/php/modules
$ cp curl.so curl.so.bak
//查看目前的curl版本
$ curl -V

先去官网查找下载同版本的源码   https://curl.se/download/
 

$ wget https://curl.se/download/curl-7.52.1.tar.gz
$ ./configure --prefix=/usr/local/curl/ --without-nss --with-ssl
$ make && make install

phpinfo()查看PHP版本,

到官网找该版本的下载地址 https://www.php.net/releases/

//下载源码
$ wget https://www.php.net/distributions/php-5.4.45.tar.gz
$ tar zxvf php-5.4.45.tar.gz
$ cd php-5.4.45/ext/curl
//如果没有phpize命令是因为没有装php-devel组件,可以yum安装一下
$ phpize
//仅编译curl扩展即可
$ ./configure --with-curl=/usr/local/curl
//注意 make install 会覆盖 /usr/lib64/php/modules/curl.so记得提前备份
$ make & make install
//重启 httpd 服务即可
$ service httpd restart

查看下

并且再次测试,


恢复正常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值