返回

解决 Windows Composer SSL 证书错误 (curl error 60)

php

Windows 下 Composer 报错:curl error 60 (SSL certificate problem) 解决方案

最近在使用 Composer 更新 Laminas 项目时,突然遇到了 curl error 60 while downloading https://repo.packagist.org/packages.json: SSL certificate problem: unable to get local issuer certificate 这个错误。以前用得好好的,这两天突然就不行了。 报错信息明确指出是 SSL 证书问题,无法获取本地颁发者证书。

问题原因分析

这个错误通常是因为 PHP 的 cURL 扩展或系统本身无法验证 Packagist 服务器的 SSL 证书。可能的原因有:

  1. 缺少或过期的 CA 证书: cURL 需要一组受信任的证书颁发机构 (CA) 证书来验证服务器的 SSL 证书。系统自带的 CA 证书可能过期或不完整。
  2. 证书路径配置错误: PHP.ini 中 curl.cainfoopenssl.cafile 指向的证书文件路径不正确,或者文件不存在、损坏。
  3. 防火墙或杀毒软件干扰: 有些防火墙或杀毒软件可能会拦截 SSL 连接,导致证书验证失败。(虽然我把杀毒软件关了没用,但也不能排除这个可能)
  4. 系统时间错误: 如果你的系统时间不准,也会导致证书校验失败。
  5. OpenSSL 版本问题 : 老旧版本可能存在BUG。

解决方案

针对上述可能的原因,可以尝试以下几种解决方案:

1. 更新 CA 证书

这是最常见的解决方法。下载最新版本的 cacert.pem 文件,并配置 PHP 使用它。

步骤:

  1. 下载 cacert.pem: 访问 https://curl.se/docs/caextract.html ,下载 cacert.pem 文件。

  2. 放置 cacert.pem: 将下载的文件放到一个安全的位置。例如,可以放到 PHP 安装目录下的 extras/ssl 文件夹中(如果该文件夹不存在,可以手动创建)。比如 C:\PHP\extras\ssl\cacert.pem

  3. 修改 php.ini: 找到你正在使用的 php.ini 文件(可以通过 php --ini 命令查看)。编辑 php.ini,找到 curl.cainfoopenssl.cafile 这两个配置项。如果这两个配置项被注释了,去掉注释符号 ;。修改这两个配置项的值,指向你放置 cacert.pem 的完整路径:

    curl.cainfo = C:\PHP\extras\ssl\cacert.pem
    openssl.cafile = C:\PHP\extras\ssl\cacert.pem
    
  4. 重启 Web 服务器: 如果你是通过 Apache 或 Nginx 等 Web 服务器运行 PHP,需要重启 Web 服务器以使配置生效。如果是命令行使用则无需重启。

  5. 校验SHA256(可选但建议):

    • 在网页 https://curl.se/docs/caextract.html 上,你可以找到当前 cacert.pem 文件的 SHA256 校验和。
    • 用任何支持SHA256校验的工具或者使用php内置函数校验下载文件的hash。可以用如下php代码确认下载的 cacert.pem是否和网站提供的一致:
    <?php
    echo hash_file('sha256', 'C:\PHP\extras\ssl\cacert.pem', false); // 替换为你的 cacert.pem 路径
    ?>
    

    确保输出的哈希值与 curl 官网提供的一致。如果不一致,说明下载的文件可能已损坏,需要重新下载。

安全建议: 不要从不可靠的来源下载 cacert.pem 文件。

2. 设置 Composer 的 CA 证书

如果修改 php.ini 影响范围太大,或者你没有权限修改 php.ini,可以只针对 Composer 设置 CA 证书。

步骤:

  1. 找到 Composer 的 config.json 文件: 一般位于用户目录下的 .composer 文件夹(windows下通常是C:\Users\<YourUserName>\AppData\Roaming\Composer)。

  2. 修改 config.json: 打开 config.json 文件,添加或修改 cafile 配置项:

    {
        "config": {
            "cafile": "C:\\PHP\\extras\\ssl\\cacert.pem"
        }
    }
    

同样, 路径需要更改为你的 cacert.pem 的实际路径.

  1. 保存 config.json

3. 禁用 SSL 验证 (不推荐)

如果实在搞不定证书问题,可以暂时禁用 SSL 验证。但强烈不推荐 这样做,因为这会使你的连接容易受到中间人攻击。

步骤:

在 Composer 的 config.json 文件中添加或修改 disable-tls 配置项为 true:

{
    "config": {
        "disable-tls": true
    }
}

或者通过composer 命令行操作:

composer config -g disable-tls true

再次强调:不要长期禁用 SSL 验证 。这只是一个临时性的解决方案。在生产环境中一定要确保 SSL 验证是启用的。

4. 检查系统时间

确保你的 Windows 系统时间是准确的。系统时间不正确会导致证书验证失败。

步骤:
右键点击任务栏时间->调整日期/时间, 确保自动设置时间已开启,并同步时间。

5. 检查和升级 OpenSSL (进阶)

如果你对OpenSSL较为熟悉, 可以检查下是不是OpenSSL版本老旧存在Bug。

步骤(Windows):

  1. 确认 OpenSSL 版本:
    打开命令行, 输入 openssl version 查看当前版本。
  2. 下载更新(如有必要):
    可以考虑从 OpenSSL 官网(https://www.openssl.org/source/) 或第三方编译版本 (https://slproweb.com/products/Win32OpenSSL.html)下载较新的 OpenSSL, 并配置好环境变量,确保新版本OpenSSL生效。 注意选择与你的系统位数(32位/64位)匹配的版本。

6.检查防火墙与代理 (进阶)

有时,复杂的网络环境也可能导致证书问题,比如公司内网使用了代理。

  • 确认是否启用了代理服务器, 以及代理配置是否正确。可以在系统设置, 或者 http_proxy / https_proxy 环境变量中检查。

  • 如果通过代理也还是有问题,尝试临时绕过代理, 看是否可以正常工作, 进一步定位是否和代理相关。
    如果确认是代理问题, 可以咨询你的网络管理员。

总结排查思路

按以下步骤一步步排除:

  1. 优先考虑更新CA证书, 这是最直接有效的方式。
  2. 其次检查php.ini配置与Composer config.json 配置。
  3. 系统时间和 OpenSSL 较为底层, 通常问题出在这里的概率不大,作为备选。
  4. 禁用SSL是下下策,解决问题后务必恢复开启SSL校验。

希望上述方案能帮你解决这个问题。 如果都试了还不行,建议可以贴出更详细的composer diagnose输出, php以及openssl版本信息等,这样方便社区中其他人提供更精准的协助.