直接原因是php底层openssl/curl拒绝验证私有源自签名证书,需确认报错是否来自composer.json中repositories字段的内部域名;中文域名须转punycode;企业根证书及完整链须追加到php -r "print_r(openssl_get_cert_locations());"显示的default_cert_file路径对应ca bundle中,并确保权限为644、格式为纯pem。

直接原因是 PHP 底层 OpenSSL/cURL 拒绝验证你私有源(比如 https://pkg.公司名.内部/)返回的自签名证书,不是 Composer 本身不认证书,也不是镜像源的问题。
确认报错是否来自私有源而非镜像
Composer 官方源走镜像(如阿里云),但你 composer.json 里手动加的 repositories 才是真正触发证书校验的地方。常见错误现象:
SSL certificate problem: unable to get local issuer certificatecURL error 60: SSL certificate problem: self signed certificate- 报错发生在
composer install阶段,而不是插件执行时 -
composer config -g repo.packagist显示的是https://mirrors.aliyun.com/composer/,但错误 URL 明显是内部域名
别急着改镜像——先检查 composer.json 的 repositories 字段,定位那个带 https:// 的私有地址。
中文域名必须转 Punycode
如果私有源地址含中文(如 https://pkg.公司名.内部/),OpenSSL 不会自动做 IDN 转码,证书里的 SAN 字段匹配失败,必然报错。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用命令转:
idn --quiet --unicode "公司名.内部"→ 得到类似xn--55qx5d.内部 - 把
composer.json中该仓库的url改成https://pkg.xn--55qx5d.内部/ - 再检查证书 PEM 文件里
Subject Alternative Name是否包含这个 Punycode 域名
企业根证书必须追加到 PHP 实际使用的 CA bundle
插件或 Composer 访问私有源时复用的是 PHP 全局证书配置,COMPOSER_CAFILE 或 composer config -g cafile 对它无效。
- 查真实路径:
php -i | grep curl.cainfo或php -r "print_r(openssl_get_cert_locations());",看default_cert_file - 把你的企业根证书(PEM 格式,以
-----BEGIN CERTIFICATE-----开头)内容追加到该文件末尾,不要覆盖 - 权限必须是可读且不能是
777(PHP 会拒绝加载):chmod 644 /path/to/cacert.pem - 改完后重启 CLI 终端或 Web 服务(
sudo systemctl restart php-fpm等)
别忽略证书链顺序和完整性
只放根证书不够——如果你的私有源证书是中间 CA 签发的,PHP 需要完整链才能验证。错误做法:
- 只把根 CA 追加进系统 bundle,但没放中间证书
- 证书文件里有重复、乱序或非 PEM 内容(比如注释、空行、HTML 标签)
- 用了
.pfx或.der格式,没转成 PEM
正确做法:用文本编辑器打开你的证书文件,确保只有从 -----BEGIN CERTIFICATE----- 到 -----END CERTIFICATE----- 的块,且顺序是:叶证书(可选)、中间证书、根 CA。










