Verdaccio默认不支持HTTPS,必须通过Caddy等反向代理实现本地SSL+Basic Auth;Node.js进程需通过NODE_EXTRA_CA_CERTS显式信任Caddy的internal CA证书,npm则需单独配置cafile,三者证书与鉴权链必须严格对齐。

Verdaccio 默认不支持 HTTPS,直接在 VSCode 里调试 Node 应用时若想走本地 SSL + 鉴权通道访问私有库,必须手动补全 TLS 层和认证链——这不是 Verdaccio 自身配置能解决的,而是要靠反向代理或客户端适配。
verdaccio 本身不提供 HTTPS 支持
Verdaccio 启动后默认只监听 HTTP(http://localhost:4873),它没有内置 TLS/SSL 能力。即使你给 config.yaml 加了 https 相关字段,启动也会报错或静默忽略。官方明确说明:HTTPS 必须由前置代理(如 nginx、Caddy)或 Node.js 客户端自行处理。
- 常见错误现象:
ERR_SSL_PROTOCOL_ERROR或UNABLE_TO_VERIFY_LEAF_SIGNATURE,尤其在npm install或require('https')请求私库时 - VSCode 调试时出问题,往往是因为
process.env.NODE_TLS_REJECT_UNAUTHORIZED='0'被误设,或证书未被 Node.js 进程信任 - 不要试图用
openssl生成自签名证书后硬塞进 Verdaccio 配置——它根本不会读
用 Caddy 做反向代理实现本地 HTTPS + Basic Auth
比起 nginx,Caddy 更适合本地开发:自动签发 HTTPS(包括 localhost)、配置简洁、无需手动管理证书。
- 安装 Caddy(Mac/Linux):
brew install caddy;Windows 用choco install caddy - 创建
Caddyfile(放在项目根目录或任意位置):
https://localhost:4873 {
reverse_proxy http://127.0.0.1:4873
tls internal
basicauth * {
myuser JDJhJDEwJE5vZGVEZXZlbG9wZXJzQW5kQmFzaWMuY29tJDJhJDEwJE5vZGVEZXZlbG9wZXJzQW5kQmFzaWMuY29tJDJhJDEwJE5vZGVEZXZlbG9wZXJzQW5kQmFzaWMuY29t
}
}-
tls internal让 Caddy 自动生成并信任 localhost 证书(证书路径会打印在启动日志里) -
basicauth密码是 bcrypt hash,可用caddy hash-password生成;Verdaccio 的htpasswd文件格式不兼容此处,必须另算 - 启动:
caddy run --config ./Caddyfile,之后访问https://localhost:4873即可
VSCode 中让 Node.js 进程信任本地证书
Node.js 默认不信任 Caddy 的 internal CA,直接 https.request 或 npm install 仍会失败。需显式注入证书链。
- 运行 Caddy 后,它会在终端输出类似:
Using local certificate authority at /Users/xxx/.local/share/caddy/pki/authorities/local/root.crt - 把该
root.crt内容追加到 Node.js 的信任列表(不是系统级):export NODE_EXTRA_CA_CERTS="/path/to/root.crt" - VSCode 的
launch.json中必须设置该环境变量:
{
"configurations": [{
"type": "node",
"request": "launch",
"name": "Launch with SSL trust",
"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/ts-node",
"env": {
"NODE_EXTRA_CA_CERTS": "${workspaceFolder}/certs/caddy-root.crt"
},
"args": ["${file}"]
}]
}- 注意:证书路径必须是绝对路径,且文件需存在;相对路径或拼写错误会导致静默失败
-
npmCLI 不读NODE_EXTRA_CA_CERTS,所以npm install仍需配合--cafile或全局配置npm config set cafile /path/to/root.crt
npm 客户端鉴权不能复用 Verdaccio 的 htpasswd
Verdaccio 的 htpasswd 是用于 Web UI 和 npm adduser 的 Basic Auth 凭据,但 Caddy 的 basicauth 是独立校验层——两者密码哈希格式不同,不能共享同一文件。
- 如果你坚持用 Verdaccio 原生鉴权,就别加 Caddy 的
basicauth,改用npm login --registry https://localhost:4873,但此时 HTTPS 仍需前置代理提供 - 更稳妥的做法:停用 Verdaccio 的
auth.htpasswd.max_users(设为-1),关闭注册入口,所有用户凭 Caddy 的账号登录,Verdaccio 只做包代理和存储 - VSCode 里调试时,
process.env.NPM_CONFIG_REGISTRY应设为https://localhost:4873,而非http://localhost:4873,否则请求会被重定向或拒绝
真正麻烦的不是配置步骤,而是证书信任链和鉴权层级的错位——Caddy 管 HTTPS 和第一层 Auth,Verdaccio 管包权限和第二层 Auth,Node.js 进程又得单独信一个 CA。三者稍有不一致,就会卡在 SSL handshake 或 401 上,且错误提示极其模糊。


















