前言

想在新服务器上跑一个 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 成功安装!

文章目录