node.js调用php接口报ssl错误,本质是默认校验服务端证书;开发环境可禁用验证(rejectunauthorized: false),生产环境须配置正确ca证书链。

Node.js 调用 PHP 接口(比如通过 https.request 或 axios)报 SSL 错误,本质是 Node.js 默认校验服务端证书,而 PHP 后端用的是自签名证书、过期证书、或域名不匹配的证书。直接关验证最省事,但只适用于开发/测试;生产环境必须装对证书。
Node.js 请求 PHP 时提示 UNABLE_TO_VERIFY_LEAF_SIGNATURE 怎么办
这是 Node.js 的默认行为:它不会信任系统 CA 之外的证书,哪怕你的 PHP 服务用了 Let’s Encrypt 证书,如果中间链没配全,也会触发这个错误。
- 检查 PHP 服务是否返回完整证书链(可用
openssl s_client -connect your-php-domain:443 -showcerts看) - 确认 Node.js 进程启动时没设置
NODE_TLS_REJECT_UNAUTHORIZED=0—— 这个环境变量会全局禁用验证,不推荐 - 如果是本地开发用 XAMPP/MAMP/WAMP,PHP 启的 HTTPS 往往是自签名的,必须手动处理证书
用 https.Agent 关闭 SSL 验证(仅限开发)
在发起请求时传入自定义 https.Agent,把 rejectUnauthorized 设为 false。注意:这不是“忽略证书”,而是彻底跳过整个 TLS 验证流程,中间人攻击风险极高。
const https = require('https');
const axios = require('axios');
const agent = new https.Agent({
rejectUnauthorized: false
});
axios.get('https://localhost:8000/api.php', { httpsAgent: agent })
.then(res => console.log(res.data));
- 不能用于生产环境,CI/CD 流水线或上线后必须删掉
- 某些 Node.js 版本(如 19+)会额外抛
ERR_TLS_CERT_ALTNAME_INVALID,需同时加checkServerIdentity: () => undefined - 如果用原生
https.request,同样要传agent和checkServerIdentity
让 Node.js 信任 PHP 自签名证书(推荐方案)
把 PHP 服务的根证书(ca.crt)或完整证书文件(fullchain.pem)读进来,加到 ca 选项里。Node.js 就会用它来验证服务端证书。
立即学习“PHP免费学习笔记(深入)”;
const fs = require('fs');
const https = require('https');
const axios = require('axios');
const ca = fs.readFileSync('./php-ca.crt'); // 或 ./fullchain.pem
const agent = new https.Agent({ ca });
axios.get('https://php-api.local/api.php', { httpsAgent: agent })
.then(res => console.log(res.data));
-
ca必须是 PEM 格式,不能是 DER 或 PFX;用openssl x509 -in cert.cer -out cert.pem -outform PEM转换 - 如果 PHP 用 Nginx/Apache,证书文件通常在
/etc/ssl/certs/或站点配置里指定的路径,找ssl_certificate和ssl_trusted_certificate - 多个证书可传数组:
ca: [ca1, ca2]
真正麻烦的不是加证书,而是 PHP 服务端证书链不完整、或 Node.js 没读到正确文件路径——尤其在 Docker 容器里挂载证书时,容易漏掉 ca 文件或权限不对。











