error de recepción: 'Error: Error SSL: SELF_SIGNED_CERT_IN_CHAIN' al usar npm

292

Estoy usando npm v1.0.104 / node 0.6.12 en ubuntu: recibo el error copiado a continuación al intentar instalar cualquier módulo nuevo a través de npm (probé socket.io anteriormente usando http, no https y me pregunto si eso podría han resultado en el problema con npm / certs sin firmar). El error aparece una vez que npm intenta resolver la URL ' https://registry.npmjs.org '. ¿Hay alguna forma de ignorar el error o quizás localizar / agregar el certificado a una tienda confiable para continuar usando npm?

Se apreciará cualquier idea sobre lo que se debe hacer para resolver el problema (preferiría resolver el problema a través de la configuración en lugar de reinstalarlo si es posible).

Error: "Error: Error SSL: SELF_SIGNED_CERT_IN_CHAIN"

Mensaje completo:

npm ERR! Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN
npm ERR!     at ClientRequest.<anonymous> (/usr/lib/node_modules/npm/node_modules/request/main.js:252:28)
npm ERR!     at ClientRequest.emit (events.js:67:17)
npm ERR!     at HTTPParser.onIncoming (http.js:1261:11)
npm ERR!     at HTTPParser.onHeadersComplete (http.js:102:31)
npm ERR!     at CleartextStream.ondata (http.js:1150:24)
npm ERR!     at CleartextStream._push (tls.js:375:27)
npm ERR!     at SecurePair.cycle (tls.js:734:20)
npm ERR!     at EncryptedStream.write (tls.js:130:13)
npm ERR!     at Socket.ondata (stream.js:38:26)
npm ERR!     at Socket.emit (events.js:67:17)
npm ERR! Report this *entire* log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! 
npm ERR! System Linux 2.6.38-13-generic
npm ERR! command "node" "/usr/bin/npm" "install" "jed"
npm ERR! node -v v0.6.12
npm ERR! npm -v 1.0.104
Ali Haider
fuente
1
No elimine SSL estricto. Eche un vistazo a stackoverflow.com/a/16534065
nolim1t
15
A partir del 27 de febrero de 2014, npm ya no admite sus certificados autofirmados. Consulte la publicación de blog de npm o la respuesta reciente a continuación para obtener más información.
Kevin Reilly
1
En caso de que tenga problemas con esto en AWS Elastic Beanstalk, hay una solución disponible aquí: stackoverflow.com/questions/22096459/…
Guillaume Flandre
1
nolim1t : esto no aborda la causa del problema, y Kevin : los comandos en la publicación del blog están incompletos. Consulte stackoverflow.com/a/22099006/106302 para ver los comandos que me funcionaron.
Todos somos Mónica
1
@ali POR FAVOR cambie la 'Respuesta aceptada'. Este problema aparece debido a una actualización de npm y no a un problema con SSL. Desactivar SSL es MALO, y especialmente porque la respuesta correcta actual es actualizar npm. La respuesta de Kevin Reilly debería ser la respuesta aceptada. Gracias.
Mikezx6r

Respuestas:

391

Ejecutar lo siguiente ayudó a resolver el problema:

npm config set strict-ssl false

No puedo comentar si causará otros problemas en este momento. Espero eso ayude.

Ali Haider
fuente
39
ejecute "npm config set ca null" en su lugar, ignorar los errores de SSL es una mala idea
alex
66
@SnowInferno SSL también garantiza que está hablando con el registro real.npmjs.org. Alguien podría instalar paquetes maliciosos.
adotout
58
Esto está muy mal. ¿Por qué te molestas en usar SSL si cada vez que hace lo único que se supone que debe hacer es apagarlo? "Cada vez que ignorar un error conduce al éxito, los desarrolladores lo harán".
djechlin
20
No ignore los problemas de SSL, ya que el error está ahí por una muy buena razón. Además, un poco de búsqueda resultó en el siguiente tweet, que enlaza con la solución oficial a su problema (actualización npm): twitter.com/npmjs/status/439279809307242496
Thomas Vervest
41
Mi problema fue causado por un proxy que estoy detrás, "npm config set ca null" y 'npm config set ca ""' todavía me dieron el mismo error, pero eliminar SSL funcionó perfectamente. A veces, las buenas prácticas no son tan importantes como lo que realmente funciona.
Cory Schulz
220

A partir del 27 de febrero de 2014, npm ya no admite sus certificados autofirmados . Las siguientes opciones, según lo recomendado por npm, es realizar una de las siguientes acciones:

Actualice su versión de npm

npm install npm -g --ca=""

- O -

Indique a su versión actual de npm que use registradores conocidos

npm config set ca ""

Actualización: npm ha publicado más ayuda con SELF_SIGNED_CERT_IN_CHAIN ​​y npm con más soluciones particulares para diferentes entornos



Es posible que necesite o no anteponer sudolas recomendaciones.


Otras opciones

Parece que las personas están teniendo problemas para usar las recomendaciones de npm, así que aquí hay otras posibles soluciones.

Nodo de actualización en sí mismo
Recibir este error puede sugerir que tiene una versión anterior del nodo, que naturalmente viene con una versión anterior de npm. Una solución es actualizar su versión de Node. Esta es probablemente la mejor opción, ya que lo actualiza y corrige los errores y vulnerabilidades existentes.

El proceso aquí depende de cómo haya instalado Node, su sistema operativo y otros.

Actualizar npm Dado
que probablemente llegó aquí mientras intentaba installun paquete, es posible que npm install npm -gfalle con el mismo error. Si este es el caso, use updateen su lugar. Como lo sugirió Nisanth Sojan:

npm update npm -g

Actualización alternativa npm
Una forma de evitar el problema subyacente es usar registradores conocidos, instalar y luego dejar de usar registradores conocidos. Como lo sugirió jnylen:

npm config set ca ""
npm install npm -g
npm config delete ca
Kevin Reilly
fuente
10
La solución más fácil es probablemente descargar la última versión de Nodejs en sí, incluye una nueva versión de npm donde se resuelve este problema. Ninguno de los comandos anteriores funcionó para mí.
Strille
1
Voy con esta solución ya que es la primera que no ignora ssl (ya sea configurando la comprobación en falso en la configuración o usando http en su lugar). ¡Gracias!
hcpl
12
npm install npm -g también me da el error SELF_SIGNED_CERT_IN_CHAIN
Anders Bornholm
3
Si esto no funciona, haga npm config set ca ""primero, luego actualice, luego deshaga el cambio de configuración. Ver: stackoverflow.com/a/22099006/106302
Todos somos Mónica
1
@Redsandro sudocambia el usuario, -gmarca establece si instalar globalmente para ese usuario o solo en local node_modules.
Radek
68

Por ahora acabo de cambiar la URL de registro de https a http. Me gusta esto:

npm config set registry="http://registry.npmjs.org/"
Hermann
fuente
1
Funcionó como un encanto para mí. No quería perder la CA original ni forzarla a ignorar los errores de SSL.
SnowInferno
Funcionó perfectamente. ¡Gracias!
albahaca muhammed
13
¡Desactivar la seguridad no puede ser la solución!
Alessandro Pezzato
1
Anteriormente había usado esto, pero por alguna razón cambiarlo de nuevo a 'https: //' desde 'http: //' hizo que el mío volviera a funcionar.
kshreve
Después de probar todas las demás soluciones, este trabajo finalmente me funciona :-)
Swapnil Kadu
49
npm config set strict-ssl false -g

Para guardarlo globalmente

Robin
fuente
Hacer esto me da el infame cb() never called!error npm
Jeremy
Después de esta configuración, estoy obteniendo el siguiente error npm ERR. código E401 npm ERR! No se puede autenticar, necesita: ¡Negociar, NTLM npm ERR! Puede encontrar un registro completo de esta ejecución en: npm ERR! C: \ BuildAgent \ npm-cache_logs \ 2019-06-24T10_23_46_563Z-debug.log
Shami Qureshi
31

Necesita actualizar npm.

// Do this first, or the upgrade will fail
npm config set ca ""

npm install npm -g

// Undo the previous config change
npm config delete ca

Es posible que necesite prefijar esos comandos con sudo.

Fuente: http://blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more

Todos somos monica
fuente
@Oliver Salzburg: re. su edición: en OS X, no creo que sudosea ​​necesario en absoluto, y solo prefijo el comando de actualización que sudofuncionó bien para mí. YMMV.
Todos somos Mónica
Ah, esto funcionó para mí. ¡Gracias por las instrucciones específicas sobre cómo deshacer el cambio de configuración (por lo que no tuve que desenterrarlo yo mismo)!
Matt
Interesante. Solo hice la edición después de haber probado esto en un servidor Debian. Sin embargo, me gusta la revisión actual;)
Der Hochstapler
Ubuntu / Debian requiere enlaces adicionales, vea mi respuesta a continuación.
Redsandro
2
Esta debería ser la solución aceptada. Esto no deshabilita la seguridad y es la solución "oficial" descrita en el blog de npm.
Alessandro Pezzato
21

El error SELF_SIGNED_CERT_IN_CHAIN significa que tiene un certificado autofirmado en la cadena de certificados, que básicamente no es confiable para el sistema.

Si eso sucede, básicamente está sucediendo algo sospechoso, por lo tanto, como la gente ya comentó, no se recomienda simplemente deshabilitar las comprobaciones de certificados, sino que un mejor enfoque es comprender cuál es el problema y solucionar la causa.

Esto puede estar relacionado con:

  • dirección de repositorio personalizada que no tiene el certificado correcto,

  • Una red corporativa con proxy transparente.

    Si está detrás de un proxy web corporativo, debe configurar las variables de entorno HTTP_PROXY/ adecuadas HTTPS_PROXYo establecerlas a través de npm:

    npm config set proxy http://proxy.company.com:8080
    npm config set https-proxy http://proxy.company.com:8080

    Consulte: Cómo configurar Node.js y Npm detrás de un proxy web corporativo

Si confía en el host, puede exportar el certificado autofirmado de la cadena e importarlo al sistema, de modo que estén marcados como de confianza.

Esto se puede lograr al verificar los certificados por (cambiar example.coma npm repo que falla en función del npm-debug.log):

openssl s_client -showcerts -connect example.com:443 < /dev/null

luego guarde el contenido del certificado (entre BEGINy END) en.crt archivo para importarlo.

Linux

Según la sugerencia , puede agregar el certificado exportado al /etc/environmentarchivo (Nodo 7.4+), como:

NODE_EXTRA_CA_CERTS=/etc/pki/ca-trust/source/anchors/yourCer‌​ts.pem

CentOS

En CentOS 5, esto se puede agregar al /etc/pki/tls/certs/ca-bundle.crtarchivo, por ejemplo

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq | sudo tee -a /etc/pki/tls/certs/ca-bundle.crt
sudo update-ca-trust force-enable
sudo update-ca-trust extract
npm install

Nota: Para exportar solo el primer certificado, elimínelo gal principio.

En CentOS 6, se puede copiar el archivo del certificado /etc/pki/ca-trust/source/anchors/.

Ubuntu / Debian

En Ubuntu / Debian, copie el archivo CRT y /usr/local/share/ca-certificates/ luego ejecute:

sudo update-ca-certificates

Mac OS

En macOS puedes ejecutar:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/foo.crt

Ventanas

En Windows: certutil -addstore -f "ROOT" new-root-certificate.crt


Consulte también: npm - Solución de problemas - Error de SSL

kenorb
fuente
1
> Si ese es el caso, debe exportar el certificado autofirmado de la cadena e importarlo al sistema, de modo que estén marcados como de confianza. - Hace un truco para mí.
dmi3y
2
¡Excelente! También ayuda agregar NODE_EXTRA_CA_CERTS = / etc / pki / ca-trust / source / anchors / yourCerts.pem al entorno / etc /. El nodo 7.4+ tiene esto en cuenta
ph4r05
9

Poner esto antes del comando parece funcionar NODE_TLS_REJECT_UNAUTHORIZED=0. ex:NODE_TLS_REJECT_UNAUTHORIZED=0 npm ...

Sería mejor averiguar cómo hacer que el nodo vea el certificado autofirmado como válido. la sugerencia estricta-ssl anterior no funcionó para mí por alguna razón. Si comprende las implicaciones de seguridad y necesita una solución rápida temporal, esto es lo que encontré en algunos problemas aleatorios de github durante la búsqueda del error en Google.

Adam Lane
fuente
1
para Windows, use "set NODE_TLS_REJECT_UNAUTHORIZED = 0". Y luego funciona como un encanto !!
Tarun
8

El repositorio ya no admite certificados autofirmados. Necesitas actualizar npm.

// Disable the certificate temporarily in order to do the upgrade
npm config set ca ""

// Upgrade npm. -g (global) means you need root permissions; be root 
// or prepend `sudo`
sudo npm install npm -g

// Undo the previous config change
npm config delete ca

// For Ubuntu/Debian-sid/Mint, node package is renamed to nodejs which 
// npm cannot find. Fix this:
sudo ln -s /usr/bin/nodejs /usr/bin/node

Debe abrir una nueva sesión de terminal para usar la actualizada npm.

Fuente: Esta fue originalmente una edición de la respuesta de jnylen . Aunque las pautas dicen "Damos la bienvenida a todas las ediciones constructivas, pero por favor hágalas sustanciales", la edición fue rechazada debido a "Esta edición cambia demasiado en la publicación original; el significado original o la intención de la publicación se perderían". Supongo que la comunidad prefiere una respuesta por separado.

Redsandro
fuente
Esto funcionó para mí. Sin embargo yo no necesitaba la última orden: sudo ln -s /usr/bin/nodejs /usr/bin/node.
ausencia
1
Probablemente depende de si instaló desde los repositorios oficiales de Ubuntu, un repositorio de terceros (para una versión más nueva) o si compiló usted mismo (para la versión más reciente).
Redsandro
7

Para aquellos que en una mac con el mismo problema e instalaron npm a través de homebrew :

brew uninstall npm

luego

brew install npm

Funciona para mí en osx (10.9.1)

EDITAR : es posible que lo necesite brew updateantes de instalar npm. También puede hacer una brew upgradedespués de actualizar homebrew. También podría ser útil ejecutar brew doctorsi se encuentra con otros problemas.

Patricio
fuente
4

Solución rápida y limpia (probado en Linux) (Después de fatidic el 27 de febrero de 2014)


Desinstalar npm

npm rm npm -g

Instale npm (la nueva URL es www.npmjs.org en lugar de npmjs.org )

curl https://www.npmjs.org/install.sh | sh

Consejo : cómo instalar node.js en Linux https://stackoverflow.com/a/22099363/333061

Igor Parra
fuente
El comando ya no funciona debido a una redirección 301, pero aún puede escribir https://www.npmjs.org/install.shen su navegador y descargarlo antes de ejecutarlo manualmente.
svassr
O corre rizo con la bandera -L
Evan Cordell
el curl https://npmjs.org/install.shcomando anterior está redirigiendo a https://www.npmjs.org/install.sheso es por eso que curl https://www.npmjs.org/install.sh | shfunciona sin problemas. está bien instalar desde ahora en pequeño padawan. :)
Igor Parra
2

Apagar SSL parece una idea muy mala. El blog de npm explica que ya no admiten su certificado autofirmado . Sugieren actualizar npm a través de npm install npm -g, pero por supuesto recibí el mismo error SELF_SIGNED_CERT_IN_CHAIN. Así que acabo de actualizar el nodo, que actualizó npm junto con él. El procedimiento exacto depende de cómo instaló el nodo en primer lugar.

Jeremiah Orr
fuente