Composer diagnose报OpenSSL失败但php -m显示已加载,说明扩展存在但底层能力不足:常见于OpenSSL库版本过低(如1.0.2k)、不支持TLS 1.2+或CA证书陈旧;需验证openssl_get_cert_locations、OpenSSL Library Version及TLS 1.2可用性,并区分cURL error 35(协议协商失败)与error 60(证书验证失败)。

composer diagnose 显示 OpenSSL 相关失败项,但 php -m 显示已加载
这说明 PHP 确实加载了 openssl 扩展,但底层能力不达标——常见于 OpenSSL 库版本过低(如 1.0.2k)、不支持 TLS 1.2+,或 CA 证书包陈旧。此时 composer diagnose 会报类似 OpenSSL extension enabled but unable to verify certificates 或直接提示 packagist.org is not accessible。
关键验证步骤:
- 运行
php -r "print_r(openssl_get_cert_locations());",检查default_cert_file路径是否存在、可读,且文件最后修改时间是否早于 2021 年(旧 CA 包无法验证 Let’s Encrypt ISRG Root X1) - 执行
php -i | grep -i "openssl library version",若输出是OpenSSL Library Version => 1.0.2k或更低,基本可确认协议栈不满足 Packagist 强制 TLS 1.2 要求 - 测试 TLS 1.2 是否可用:
php -r "var_dump(stream_context_get_options(stream_context_create(['ssl'=>['crypto_method'=>STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT]])));",报错即不可用
cURL 错误码 35 / 60 出现在 diagnose 或 install 过程中
curl error 35 是 TLS 握手失败,curl error 60 是证书验证失败——两者根源不同,但都指向 OpenSSL 层问题。
区分处理:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
curl error 35:不是证书问题,是协议协商失败。多见于 CentOS 7 默认 OpenSSL 1.0.2k、Alpine 3.14、或 Windows 上 XAMPP 捆绑的 PHP。需升级 OpenSSL 库并重编 PHP,不能仅更新 Composer -
curl error 60:证书链无法验证。优先检查openssl.cafile是否在php.ini中正确设置,路径是否指向有效 PEM 文件(如/usr/local/etc/php/certs/cacert.pem),Windows 路径必须用正斜杠或双反斜杠 - 临时绕过(仅调试):
composer config -g secure-http false,但会禁用所有 HTTPS 源校验,生产环境严禁使用
diagnose 通过但 install 仍失败:扩展“存在”不等于“可用”
composer diagnose 只检测扩展是否加载,不调用实际加密函数;而 composer install 会执行 openssl_verify()、下载校验签名等操作,这时才暴露底层兼容性问题。
典型表现:
-
composer diagnose显示[OK] The openssl extension is loaded,但install报error:060800A3:digital envelope routines:EVP_DigestInit_ex:disabled for fips - 根本原因是 PHP 编译时链接的 OpenSSL 头文件版本(
OpenSSL Header Version)与运行时库(OpenSSL Library Version)不一致,或系统升级 OpenSSL 后未重编 PHP,导致 ABI 不兼容(如出现undefined symbol: SSL_CTX_set_max_proto_version) - 验证方式:
php -i | grep -E "(OpenSSL Library|OpenSSL Header) Version",二者应一致且 ≥ 1.1.1f
Docker 或 macOS Homebrew 环境下的特殊处理
这些环境容易因多源混装导致 OpenSSL 版本错位,问题更隐蔽。
实操要点:
- macOS Homebrew:不要
brew install php后再单独brew install openssl@3。必须先brew uninstall php,再brew install openssl@3 && brew install php,确保 PHP 编译时自动链接新版 OpenSSL - Docker Alpine 镜像:Alpine 3.19+ 自带 OpenSSL 3.0+,但默认不启用兼容模式。需在构建阶段加
apk add openssl1.1-compat,或改用php:8.3-cli-alpine3.20 - Docker Debian/Ubuntu:基础镜像若为
php:8.2-cli,确认其来自debian:bookworm或更高版本;老镜像(如bullseye)可能仍含 OpenSSL 1.1.1n,需手动更新 CA 包并设COMPOSER_CAFILE
php.ini,而 composer 只走 CLI。哪怕浏览器里 phpinfo() 显示 OpenSSL 正常,CLI 下仍可能未启用或指向旧库。务必用 php --ini 和 which php 锁定 Composer 实际依赖的配置路径。

















