PAYATHON 2026

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 证书校验来规避错误,因为这样测试就无法验证连接对端的身份。

备注:内容仅供参考。