解决 Windows Composer SSL 证书错误 (curl error 60)
2025-03-17 02:01:18
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 证书。可能的原因有:
- 缺少或过期的 CA 证书: cURL 需要一组受信任的证书颁发机构 (CA) 证书来验证服务器的 SSL 证书。系统自带的 CA 证书可能过期或不完整。
- 证书路径配置错误: PHP.ini 中
curl.cainfo
或openssl.cafile
指向的证书文件路径不正确,或者文件不存在、损坏。 - 防火墙或杀毒软件干扰: 有些防火墙或杀毒软件可能会拦截 SSL 连接,导致证书验证失败。(虽然我把杀毒软件关了没用,但也不能排除这个可能)
- 系统时间错误: 如果你的系统时间不准,也会导致证书校验失败。
- OpenSSL 版本问题 : 老旧版本可能存在BUG。
解决方案
针对上述可能的原因,可以尝试以下几种解决方案:
1. 更新 CA 证书
这是最常见的解决方法。下载最新版本的 cacert.pem
文件,并配置 PHP 使用它。
步骤:
-
下载 cacert.pem: 访问 https://curl.se/docs/caextract.html ,下载
cacert.pem
文件。 -
放置 cacert.pem: 将下载的文件放到一个安全的位置。例如,可以放到 PHP 安装目录下的
extras/ssl
文件夹中(如果该文件夹不存在,可以手动创建)。比如C:\PHP\extras\ssl\cacert.pem
。 -
修改 php.ini: 找到你正在使用的
php.ini
文件(可以通过php --ini
命令查看)。编辑php.ini
,找到curl.cainfo
和openssl.cafile
这两个配置项。如果这两个配置项被注释了,去掉注释符号;
。修改这两个配置项的值,指向你放置cacert.pem
的完整路径:curl.cainfo = C:\PHP\extras\ssl\cacert.pem openssl.cafile = C:\PHP\extras\ssl\cacert.pem
-
重启 Web 服务器: 如果你是通过 Apache 或 Nginx 等 Web 服务器运行 PHP,需要重启 Web 服务器以使配置生效。如果是命令行使用则无需重启。
-
校验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 官网提供的一致。如果不一致,说明下载的文件可能已损坏,需要重新下载。
- 在网页 https://curl.se/docs/caextract.html 上,你可以找到当前
安全建议: 不要从不可靠的来源下载 cacert.pem
文件。
2. 设置 Composer 的 CA 证书
如果修改 php.ini
影响范围太大,或者你没有权限修改 php.ini
,可以只针对 Composer 设置 CA 证书。
步骤:
-
找到 Composer 的 config.json 文件: 一般位于用户目录下的
.composer
文件夹(windows下通常是C:\Users\<YourUserName>\AppData\Roaming\Composer
)。 -
修改 config.json: 打开
config.json
文件,添加或修改cafile
配置项:{ "config": { "cafile": "C:\\PHP\\extras\\ssl\\cacert.pem" } }
同样, 路径需要更改为你的 cacert.pem
的实际路径.
- 保存
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):
- 确认 OpenSSL 版本:
打开命令行, 输入openssl version
查看当前版本。 - 下载更新(如有必要):
可以考虑从 OpenSSL 官网(https://www.openssl.org/source/) 或第三方编译版本 (https://slproweb.com/products/Win32OpenSSL.html)下载较新的 OpenSSL, 并配置好环境变量,确保新版本OpenSSL生效。 注意选择与你的系统位数(32位/64位)匹配的版本。
6.检查防火墙与代理 (进阶)
有时,复杂的网络环境也可能导致证书问题,比如公司内网使用了代理。
-
确认是否启用了代理服务器, 以及代理配置是否正确。可以在系统设置, 或者
http_proxy
/https_proxy
环境变量中检查。 -
如果通过代理也还是有问题,尝试临时绕过代理, 看是否可以正常工作, 进一步定位是否和代理相关。
如果确认是代理问题, 可以咨询你的网络管理员。
总结排查思路
按以下步骤一步步排除:
- 优先考虑更新CA证书, 这是最直接有效的方式。
- 其次检查
php.ini
配置与Composerconfig.json
配置。 - 系统时间和 OpenSSL 较为底层, 通常问题出在这里的概率不大,作为备选。
- 禁用SSL是下下策,解决问题后务必恢复开启SSL校验。
希望上述方案能帮你解决这个问题。 如果都试了还不行,建议可以贴出更详细的composer diagnose
输出, php以及openssl版本信息等,这样方便社区中其他人提供更精准的协助.