Mensaje de error
npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE
También se muestra como
- npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE
- npm error request to https://registry.example.com/lodash failed, reason: unable to verify the first certificate
npm 10 y posteriores imprimen «npm error code UNABLE_TO_VERIFY_LEAF_SIGNATURE»; npm 9 y anteriores, «npm ERR! code UNABLE_TO_VERIFY_LEAF_SIGNATURE». Las versiones recientes de Node.js añaden «; if the root CA is installed locally, try running Node.js with --use-system-ca» a la línea del motivo.
npm (Node.js) — registry request over HTTPS
Qué significa
El registro (o un proxy situado delante) envió solo su propio certificado, y Node.js no encontró el certificado que lo emitió. Sin el emisor, la firma del certificado hoja no se puede comprobar en absoluto. Es un problema de configuración del servidor: falta el certificado intermedio en el handshake, y Node.js no lo subsana descargándolo.
Por qué ocurre
Un registro privado configurado solo con el certificado hoja
frecuenteNexus, Artifactory, Verdaccio o un proxy inverso situado delante, instalados con cert.pem en lugar de la cadena completa.
Un proxy que solo presenta su certificado hoja
ocasionalAlgunos proxies que inspeccionan TLS envían un certificado emitido por un intermedio sin incluir ese intermedio.
Un certificado hoja de una CA privada desconocida
ocasionalSi Node.js no conoce nada por encima del certificado hoja, aparece el mismo código; confiar en la CA (y en su intermedio) lo soluciona.
Cómo solucionarlo
- 1.
Contar los certificados del handshake
Que solo aparezca la profundidad 0, con un intermedio como emisor, confirma que falta el intermedio.
bash openssl s_client -connect registry.example.com:443 -servername registry.example.com -showcerts </dev/null 2>/dev/null \ | grep -E '^ *[0-9]+ s:|^ *i:' - 2.
Servir la cadena completa en el registro
Configura el terminador TLS situado delante del registro con el certificado hoja más los intermedios. Esto lo soluciona a la vez para npm, yarn, pnpm, Docker y cualquier otro cliente.
text # Registry behind nginx: serve leaf + intermediate(s) ssl_certificate /etc/nginx/tls/registry.example.com.fullchain.pem; ssl_certificate_key /etc/nginx/tls/registry.example.com.key; - 3.
Solución provisional: confiar en el intermedio en el cliente
Un cafile con el intermedio y su raíz permite que npm verifique el certificado hoja hasta que se corrija el servidor; cafile sustituye las raíces predeterminadas de npm, así que añade también las raíces públicas si ese mismo npm usa además registry.npmjs.org.
bash # Until the registry is fixed: trust the intermediate (plus its root) on the client cat issuing-ca.pem corp-root-ca.pem > /etc/ssl/private-ca/registry-ca.pem npm config set cafile /etc/ssl/private-ca/registry-ca.pem