Node.js fetch 如何信任 Caddy 的本地 HTTPS 证书?
数据小陈
结论
让运行 Playwright 测试的 Node.js 进程信任 Caddy tls internal 使用的本地根证书。浏览器能访问该地址,说明浏览器信任这张证书;Playwright 测试中的 Node.js fetch 可能使用另一套证书信任配置,因此仍会报 unable to get local issuer certificate。
配置 Node.js 信任 Caddy 的根证书
从 Caddy 的数据目录中找到本地 CA 根证书 root.crt。它通常位于 pki/authorities/local/root.crt;实际路径取决于 Caddy 的运行方式和数据目录配置。如果 Caddy 在容器中运行,可以从容器复制证书,例如:
docker cp <caddy容器名>:/data/caddy/pki/authorities/local/root.crt ./caddy-local-root.crt
先确认容器的数据目录确实是 /data/caddy。只需要根证书,不要复制或分发 CA 私钥。
运行 Playwright 测试前,将根证书路径设为 NODE_EXTRA_CA_CERTS:
export NODE_EXTRA_CA_CERTS="$(pwd)/caddy-local-root.crt"
npm test
这个环境变量必须在 Node.js 进程启动时设置。如果测试由 IDE、CI 或其他进程启动,也要在相应的启动环境中配置。进程启动后再设置,不会追溯生效。
配置完成后,原来的 fetch 调用无需修改:
const response = await fetch('https://mailpit.my-site.test/api/v1/messages', {
method: 'GET',
headers: {
'Content-Type': 'application/json',
},
})
如果仍然报错
确认 NODE_EXTRA_CA_CERTS 指向 Caddy tls internal 使用的 CA 根证书,并检查请求域名 mailpit.my-site.test 是否与服务证书匹配。如果 Caddy 更换了本地 CA,或测试环境中的证书文件并非该 CA 的根证书,Node.js 仍无法验证服务端证书链。
不建议关闭 TLS 证书校验来规避错误,因为这样测试就无法验证连接对端的身份。
备注:内容仅供参考。
