composer - 更新出错 ssl3_get_server_certificate:certificate verify failed

这是在运行 composer self-update -vvv 来更新 composer.phar 的时候出现的.

错误内容:

  1. [Composer\Downloader\TransportException]
  2. The "https://getcomposer.org/version" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
  3. error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
  4. Failed to enable crypto
  5. failed to open stream: operation failed

从网上搜罗了很多的解决方式, 指定了两个方面的问题

  • 是否开启 opensslcurl
  • 是否配置正确的 openssl.cafile 的证书路径

但是这两个问题还是没能解决以上的错误, 另外还存在一个问题就是 ca 证书的问题: 下载证书: http://curl.haxx.se/docs/caextract.html

  • 自动转换的证书(CA Certs from mozilla.org)

HTTP from curl.haxx.se: cacert.pem HTTPS from github: ca-bundle.crt

  • 移除 RSA-1024 的证书 (RSA-1024 removed)

在 2014.9 早些时候, Mozilla 移除了 RSA 1024 校验. 这导致了 一些 TSL 库不能去验证网站的正确性(如果不支持 RFC4185 的 path discovery 属性).这包含OpenSSL 和 GnuTLS. 所以在清理之前转换的 CA 证书在这里下载: an older ca-bundle from github.

配置 php.ini

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

问题解决.

远程的包更改为本地开发模式

有时候我们会遇到线上的composer 开发包功能不是很完善, 但是很多功能我们还能够用到, 我们只能自己去修改一部分代码让这个包能够去运行, 同时不使用 composer 进行更新, 否则代码会再更新的时候再次被覆盖掉.
下边是以下几个步骤:
composer.json 中去掉调用
一般情况下, 去掉包, 包在进行更新的时候会自己删除
vendor/composer/installed.json 中去掉这个已经安装的引用
这样在再次安装的时候这个包就会保留到本地, 不会被删除掉
composer.json 中加入对这个包的命名空间的映射
因为composer 的包都会自动进行加载, 如果没有进行加载, 则也是找不到这个文件, 所以需要对命名空间做下映射
比如我们引用一个第三方包, 他的命名空间是这样的

  1. "autoload": {
  2. "psr-4": {
  3. "Imvkmark\\L5Thumber\\": "src/L5Thumber"
  4. }
  5. },

我们需要在根目录下的 composer.json加入

  1. "autoload": {
  2. "psr-4": {
  3. "Imvkmark\\L5Thumber\\": "vendor/imvkmark/l5-thumber/src/L5Thumber",
  4. }
  5. },

这样便能够对包的命名空间进行映射, 同时进行修改了.
更新 composer.json
其实到这里已经结束, 并且完成了自己的功能了.
这样我们可以不受顾忌的修改代码, 并且同时给作者发送推送请求, 等待作者更新这个代码, 然后我们再改回来, 这样我们又能够使用最新的库了.

运行 composer 安装包的时候出现 curl 错误

curl error 60 while downloading https://raw.githubusercontent.com/symfony/recipes/flex/main/index.json: SSL: no alternative certificate subject name matches target host name ‘raw.githubusercontent.com’

或者

In CurlDownloader.php line 377: curl error 28 while downloading https://raw.githubusercontent.com/symfony/recipes/flex/main/index.json: Connection timeout after 10004 ms

这种情况下是使用了代理, 第一种情况是代理转发的时候证书出现问题, 导致不匹配, 第二种是请求的时候代理无法访问到这个网站导致的
解决方法:
使用 https://raw.hellogithub.com/hosts 获取host, 不使用代理的方式来访问, 这样既能够保障联通, 又能够保障证书
以下方案看情况, 很难保证一定成功
另一种 timeout 方案, 可尝试

  1. $ composer config --global process-timeout 3000

另一种 ssl 方案, 可尝试

  1. $ composer config -g -- disable-tls false