Saltar al contenido
ecdsa.com
npm (Node.js)Gestores de paquetes

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

Cómo solucionarlo

  1. 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. 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. 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

Errores relacionados

Explorar toda la base de datos de errores de firma