CentOS 7.6 安装 composer 报错: SSL routines:tls_process_server_certificate:certificate verify failed
前言
想在新服务器上跑一个 Laravel 项目,默认需要安装 composer 库管理工具。
系统: Linux release 7.6.1810 (Core)
php: 7.3.3
下载来源站:https://getcomposer.org/download/
命令行安装步骤:
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '48e3236262b34d30969dca3c37281b3b4bbe3221bda826ac6a9a62d6444cdb0dcd0615698a5cbe587c3f0fe57a54d8f5') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
但是,在第一步从来源站 copy 安装脚本的时候就报错了:
copy()... OpenSSL Error messages: error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed in Command line code
解决
百度找不到好的解决方案,求助 Google。找到这样一篇:OpenSSL Failed to enable crypto #6870,里面提到的解决方案:
Fixed by disable Kaspersky Antivirus
意思是关闭卡巴斯基防病毒进程。我的主机上是肯定没有安装这个东西的,猜想是不是防火墙在搞事情。
检查防火墙状态(centos7
高版本对 iptables
做了优化更新,把 iptables
服务改成了 firewalld
)
service firewalld status
防火墙并未开启(inactive)。在同一讨论问题中发现了另一个解决方案:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed #3346。
方案摘抄如下:
First: Check certificate file location which will be in default_cert_file key, you will found it in openssl_get_cert_locations() its php openssl function:
$ php -r "print_r(openssl_get_cert_locations());"
Array
(
[default_cert_file] => /opt/lampp/share/openssl/cert.pem
[default_cert_file_env] => SSL_CERT_FILE
[default_cert_dir] => /opt/lampp/share/openssl/certs
[default_cert_dir_env] => SSL_CERT_DIR
[default_private_dir] => /opt/lampp/share/openssl/private
[default_default_cert_area] => /opt/lampp/share/openssl
[ini_cafile] =>
[ini_capath] =>
)
Second: Download http://curl.haxx.se/ca/cacert.pem:
$ wget http://curl.haxx.se/ca/cacert.pem
Third: Copy certificate PEM file into default_cert_file location:
$ sudo mv cacert.pem /opt/lampp/share/openssl/cert.pem
My php-cli is under XAMPP and default_cert_file maybe point to some place that is different than this.
I hope anything after that should goes fine with you brothers.
按照他步骤进行,解决。
大致原因是 openssl 默认的证书不存在,验证失败。下载一个第三方提供的证书,放到配置目录下就好了。
具体步骤:
英语不太好的童鞋可能看不懂,我把上面的英文方案翻译一下
第一步:检查证书的地址
你可以通过执行 php 函数 openssl_get_cert_locations()
找到证书的地址,地址键名 default_cert_file
。
服务器命令行下执行:
php -r "print_r(openssl_get_cert_locations());"
示例结果:
Array
(
[default_cert_file] => /opt/lampp/share/openssl/cert.pem
[default_cert_file_env] => SSL_CERT_FILE
[default_cert_dir] => /opt/lampp/share/openssl/certs
[default_cert_dir_env] => SSL_CERT_DIR
[default_private_dir] => /opt/lampp/share/openssl/private
[default_default_cert_area] => /opt/lampp/share/openssl
[ini_cafile] =>
[ini_capath] =>
)
所以示例中的默认证书地址即为:/opt/lampp/share/openssl/cert.pem
,你可以检查改目录下的文件是否存在,若存在则不用继续以下步骤了,需要另找解决方案。我的情况是这个默认证书文件缺失。
第二步:下载第三方证书
服务器命令行下执行:
wget http://curl.haxx.se/ca/cacert.pem
可将第三方证书下载到当前目录。
第三步:复制下载的 pem 证书文件到默认的证书文件地址
在证书下载目录下执行:
sudo mv cacert.pem /opt/lampp/share/openssl/cert.pem
后面的默认证书地址替换成你自己的证书地址。
到此,问题就解决了,再次执行 copy() 安装脚本,composer 成功安装!