症状
Node 发出的 HTTPS 请求以 unable to verify the first certificate 或 self-signed certificate in certificate chain 失败,而 curl 或浏览器却能正常连接。差异通常来自 Node 历史上自带 CA 库而非使用系统库,以及服务端省略了中间证书——浏览器会去补取,Node 则不会。
诊断
用 openssl s_client -showcerts 查看服务端呈现的链;检查 NODE_EXTRA_CA_CERTS;显式带上 CA 再试以确认缺失信任。
openssl s_client -connect host:443 -servername host -showcerts
根因
Node 无法由服务器证书构建到受信任根的链,因为呈现的链缺少中间证书,或 Node 使用的信任库中没有该签发 CA。
修复
修服务端使其发送完整链;以 NODE_EXTRA_CA_CERTS 把所需 CA 加入环境信任。优先修正信任而非关闭校验。
验证
重新连接确认无 TLS 错误,并确认证书针对预期签发者校验通过。受信任的链加上成功请求即证明修复。
常见陷阱
在代码里设置 rejectUnauthorized:false 会全局关闭校验;只应针对已知可信的私有环境做显式、局部的例外。