当前位置: 代码迷 >> 综合 >> file_get_contents、fopen请求https地址时SSL routines:ssl3_get_server_certificate:certificate verify failed
  详细解决方案

file_get_contents、fopen请求https地址时SSL routines:ssl3_get_server_certificate:certificate verify failed

热度:43   发布时间:2023-11-25 02:18:59.0

最近我在mac上安装了一个继承环境,在openssl模块安装时未发现什么问题,但在对https地址使用file_get_contents()、fopen()等函数时会报openssl相关的一些错误,包括但不限于一下几种:

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

以上报错是我在重新编译openssl出现的,之前的一些报错类型没有记录,在此就不赘述了。

这是因为PHP无法验证证书,如消息所示!它无法验证证书的原因几乎肯定与文件证书颁发机构文件(即CA文件)有关。看看phpinfo并查找openssl.cafile,可以从php.ini文件中找,也可通过以下命令:

$ php -i |grep opensslConfigure Command =>  './configure'  '--prefix=/Applications/MxSrvs/bin/php' '--with-config-file-path=/Applications/MxSrvs/bin/php/etc' '--with-pdo-mysql' '--with-mysqli' '--with-zlib' '--with-curl' '--with-gd' '--with-jpeg-dir=/Applications/MxSrvs/libs/jpeg' '--with-png-dir=/Applications/MxSrvs/libs/libpng' '--with-freetype-dir=/Applications/MxSrvs/libs/freetype' '--with-libxml-dir=/Applications/MxSrvs/libs/libxml2' '--with-openssl=/Applications/MxSrvs/libs/openssl' '--enable-mbstring' '--enable-ftp' '--enable-bcmath' '--enable-sockets' '--enable-sysvmsg' '--enable-sysvsem' '--enable-sysvshm' '--enable-fpm'
openssl
Openssl default config => /Applications/MxSrvs/libs/openssl/ssl/openssl.cnf
openssl.cafile  => no value => no value
openssl.capath => no value => no value
PATH => /Applications/MxSrvs/bin/mysql/bin:/Applications/MxSrvs/libs/openssl/bin:/Applications/MxSrvs/bin/php/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
$_SERVER['PATH'] => /Applications/MxSrvs/bin/mysql/bin:/Applications/MxSrvs/libs/openssl/bin:/Applications/MxSrvs/bin/php/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

可以注意到没有制定证书
openssl.cafile => no value => no value
openssl.capath => no value => no value

可以通过以下地址下载最新的ca证书
https://curl.haxx.se/ca/cacert.pem

解决此问题的最简单方法是使用以下行将CA文件添加到PHP的配置(php.ini):

openssl.cafile=/path/to/cacert.pem

如果使用php-fpm的话需要重启php-fpm配置生效,cli运行时即加载新的配置。

配置好后再次尝试通过fopen()、file_get_content()函数请求https地址恢复正常。

  相关解决方案