php使用fopen/readfile等函数时打开https SSL类型的URL返回false的解决方案

逍遥乐的缩略图需要将文章图片根据url读取并生成缩略图存储。由于之前逍遥乐,将网站升级到了https,导致新文章无法获取图片,以致于一直是缩略图。逍遥乐由于工作繁忙,很少关注博客了,以致于居然一直没发现,这两天发布文章时才发现的。。

php使用fopen/readfile等函数时打开https SSL类型的URL返回false的解决方案

知道问题就去解决吧,最终追查到是图片没有读取成功。什么原因呢.

try
...
  $fp = ($img, "r");
...
} catch ( Exception $e ) {
  // send error message if you can
}

生成日志发现

fopen(): SSL operation failed with code 1. OpenSSL Error messages:
error::SSL routines:ssl3_get_server_certificate:certificate verify failed

意思是证书验证失败。

有两种方式:

1、关闭验证(不推荐)
此时我们可以设置fopen/的最后一个$context参数将ssl认证关闭就可以解决了,关闭方法如下:

   $context = stream_context_create(
            [
                'ssl' => [
                    'verify_peer' => ,
                ]
            ]);
       fopen($url, 'rb', null, $context)
       ($url, null, $context);

至此,就可以成功访问https类型URL的内容了哦

2、配置(推荐)

既然报错是缺少证书那么增加证书配置即可。

1、下载cert证书到本地,放到nginx或者php文件夹

如:D:/nginx/cacert.pem    或者类似/usr/local/php,

下载地址:

https://curl.haxx.se/ca/cacert.pem

2、修改php.ini openssl.cafile= 改为 openssl.cafile=/usr/local/php/cacert.pem
3、重启nginx或者Apache后,重新执行即可~

至此,问题解决!