¿Cómo corregir el error del certificado SSL al ejecutar Npm en Windows?

88

Cuando intento instalar un paquete con npm, no funciona. Después de una larga espera, finalmente obtengo un error 'No se pudo establecer el socket de tunelización, sutatusCode = 403'.

$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
npm ERR!     at ClientRequest.onConnect (c:\Program Files\nodejs\node_modules\npm\node_modules\request\tunnel.js:148:19)
npm ERR!     at ClientRequest.g (events.js:193:14)
npm ERR!     at ClientRequest.EventEmitter.emit (events.js:123:20)
npm ERR!     at Socket.socketOnData (http.js:1393:11)
npm ERR!     at TCP.onread (net.js:403:27)

Sin embargo, cuando navego a la misma URL en mi navegador web (Google Chrome), se carga bien (ver nota al pie). https://registry.npmjs.org/coffee-script

¿Qué va mal?


Si bien uso un proxy https, estoy seguro de que este no es el problema. He configurado la variable de entorno https_proxy(según la guía del usuario de npm ). Sé que la variable de entorno es correcta, porque el administrador de paquetes de Python la pipsigue correctamente.

Creo que el problema está relacionado con los certificados SSL, porque si descargo esa URL con wget, obtengo un error explícito sobre los certificados.

$ wget https://registry.npmjs.org/coffee-script
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = c:/progra~1/wget/etc/wgetrc
--2012-12-17 12:14:07--  https://registry.npmjs.org/coffee-script
Resolving corpproxy... 10.254.215.35
Connecting to corpproxy|10.254.215.35|:8080... connected.
ERROR: cannot verify registry.npmjs.org's certificate, issued by `/C=US/ST=CA/L=Oakland/O=npm/OU=npm Certificate Authority/CN=npmCA/[email protected]':
  Unable to locally verify the issuer's authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

¿Cómo puedo arreglar esto? Sin comprometer la seguridad.


También solía obtener errores de certificado SSL en mi navegador web, hasta que instalé el certificado 'npmCA' como una 'autoridad de certificación raíz confiable' en las Opciones de Internet del Panel de control (captura de pantalla ingrese la descripción de la imagen aquí)


Editar: probé una solución insegura según https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

Sin embargo, todavía se agota con el mismo error.

$ npm install coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm http GET https://registry.npmjs.org/coffee-script
npm ERR! Error: tunneling socket could not be established, sutatusCode=403
Coronel Panic
fuente
Esto es similar al problema que estoy teniendo: stackoverflow.com/questions/11773509/…
nwinkler
1
Hola. Ver también github.com/isaacs/npm/issues/2728
Colonel Panic
Ingresar "npm set strict-ssl false" resolvió un problema
MrD

Respuestas:

142

TL; DR : simplemente ejecute esto y no deshabilite su seguridad:

Reemplazar certificados existentes

# Windows/MacOS/Linux 
npm config set cafile "<path to your certificate file>"

# Check the 'cafile'
npm config get cafile

o extender certificados existentes

Establezca esta variable de entorno para extender certificados predefinidos: NODE_EXTRA_CA_CERTS a"<path to certificate file>"

Historia completa

Tuve que trabajar con npm, pip, maven, etc., detrás de un firewall corporativo bajo Windows, no es divertido. Intentaré mantener esta plataforma agnóstica / consciente siempre que sea posible.

HTTP_PROXY y HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXYson variables de entorno que utilizan muchos software para saber dónde está su proxy. Bajo Windows, muchos software también usan el proxy especificado por su sistema operativo, lo cual es algo totalmente diferente. Eso significa que puede hacer que Chrome (que usa el proxy especificado en sus Opciones de Internet) se conecte bien a la URL, pero npm, pip, maven, etc.no funcionan porque usan HTTPS_PROXY (excepto cuando usan HTTP_PROXY - ver más adelante). Normalmente, la variable de entorno se vería así:

http://proxy.example.com:3128

Pero obtienes un 403 que sugiere que no estás autenticado con tu proxy. Si se trata de una autenticación básica en el proxy, querrá establecer la variable de entorno en algo de la forma:

http://user:[email protected]:3128

El temido NTLM

Existe un código de estado HTTP 407 (se requiere autenticación de proxy), que es la forma más correcta de decir que es el proxy en lugar del servidor de destino el que rechaza su solicitud. Ese código me atormentó durante más tiempo hasta que después de mucho tiempo en Google, supe que mi proxy usaba autenticación NTLM . La autenticación básica HTTP no fue suficiente para satisfacer cualquier proxy que mis señores corporativos hubieran instalado. Recurrí al uso de Cntlm en mi máquina local (no autenticado), luego hice que manejara la autenticación NTLM con el proxy ascendente. Luego tuve que decirles a todos los programas que no podían hacer NTLM que usaran mi máquina local como proxy, que generalmente es tan simple como configurar HTTP_PROXYy HTTPS_PROXY. De lo contrario, para uso de npm (como sugiere @Agus):

npm config set proxy http://proxy.example.com:3128
npm config set https-proxy http://proxy.example.com:3128

"Necesitamos descifrar todo el tráfico HTTPS porque los virus"

Después de que esta configuración había estado tarareando (torpemente) durante aproximadamente un año, los señores corporativos decidieron cambiar el poder. No solo eso, ¡sino que ya no usaría NTLM! Un mundo nuevo y valiente, sin duda. Pero debido a que esos creadores de software malicioso ahora distribuían malware a través de HTTPS, la única forma en que podían protegernos a nosotros, los pobres usuarios inocentes, era hacer un intermediario en cada conexión para buscar amenazas incluso antes de que nos alcanzaran. Como puede imaginar, me invadió la sensación de seguridad.

Para abreviar la historia, el certificado autofirmado debe instalarse en npm para evitar SELF_SIGNED_CERT_IN_CHAIN:

npm config set cafile "<path to certificate file>"

Alternativamente, el NODE_EXTRA_CA_CERTS variable de entorno se puede establecer en el archivo de certificado.

Creo que eso es todo lo que sé sobre cómo hacer que npm funcione detrás de un proxy / firewall. Que alguien lo encuentre útil.

Editar : Es una sugerencia muy común desactivar HTTPS para este problema mediante el uso de un registro o configuración HTTP NODE_TLS_REJECT_UNAUTHORIZED. Estas no son buenas ideas porque se está abriendo a más ataques man-in-the-middle o de redireccionamiento. Una rápida falsificación de sus registros DNS en la máquina que realiza la instalación del paquete y se encontrará confiando en los paquetes desde cualquier lugar. Puede parecer mucho trabajo hacer que HTTPS funcione, pero es muy recomendable. Cuando usted es el responsable de permitir la entrada de código que no es de confianza en la empresa, comprenderá por qué.

Edición 2 : tenga en cuenta esa configuraciónnpm config set cafile <path> tenga hace que npm solo use los certificados proporcionados en ese archivo, en lugar de extender los existentes con él.

Si desea extender los certificados existentes (por ejemplo, con un certificado de la empresa), utilizar la variable de entorno NODE_EXTRA_CA_CERTSpara vincular al archivo es el camino a seguir y puede ahorrarle muchos problemas. Vea cómo-agregar-autoridad-certificado-personalizada-ca-to-nodejs

Alex Taylor
fuente
9
En Windows, tuve que usar barras diagonales: npm config set cafile "C: /dev/Firefox/mycert.cer"
John Jesus
4
** Sin signo igual= npm config set cafile "<path to your certificate file>"
Moti Winkler
3
Esta es una respuesta increíble: no podría resumir mejor mis propios dolores de cabeza con respecto a proxy + zscalar
Jpnh
7
se echó a reír tanto porque "Como puedes imaginar, me invadió la sensación de seguridad". :)
Mario B
3
¿Cómo obtengo el archivo de certificado?
Aditya
36

Este problema se solucionó para mí usando la versión http del repositorio:

npm config set registry http://registry.npmjs.org/
Ehsan
fuente
52
¡Esa es una muy mala solución!
KiT O
4
@HaBo Supongo que quiere decir que esto no es seguro.
gabeio
3
@KiTO Es una mala solución, coincidió. ¿Pero por qué debería tener que lidiar con problemas de certificados cuando solo quiero instalar algunos paquetes?
Ich
17
Esta respuesta es correcta. Hay algunos casos en los que está detrás de un desorden de proxy corporativo con su propia cadena de certificados encima de otros y no hay otra forma (aparte de deshabilitar los certificados) que esta (especialmente cuando no le otorgan derechos de administrador). Esto suena como un error de npm que no carga correctamente la configuración adecuada del sistema. Pero en aras de la compatibilidad cruzada, no arreglarán el npm, por lo que este es el resultado. Las personas que dicen que es una mala respuesta, no tienen idea de lo que están hablando.
Kenorb
3
@kenorb eso es incorrecto, puede volver sobre los pasos que toma su proxy y agregar esos certificados autofirmados a su cadena con cafile.
dardo
15
npm config set strict-ssl false

resolvió el problema para mí. En este caso, tanto mi agente como el depositario de artefactos están detrás de una subred privada en la nube de AWS.

Anupam Mahapatra
fuente
7

Estoy teniendo el mismo problema, superé el uso

npm config set proxy http://my-proxy.com:1080
npm config set https-proxy http://my-proxy.com:1080

Además información en node-doc

Agus
fuente
6

Me encontré con este problema SSL similar hace unos días. El problema es que su npm no establece el certificado raíz para el certificado utilizado por https://registry.npmjs.org .

Soluciones:

  1. Utilizar wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt para solucionar el problema de wget
  2. Úselo npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtpara configurar el certificado raíz para su programa npm.

puede descargar el certificado raíz desde: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Darse cuenta: Un programa diferente puede usar una forma diferente de administrar el certificado raíz, así que no mezcle el navegador con otros.

Análisis:

solucionemos su wget https://registry.npmjs.org/coffee-scriptproblema primero. tu fragmento dice:

        ERROR: no se puede verificar el certificado de registry.npmjs.org,
        emitido por / C = US / ST = CA / L = Oakland / O = npm / OU = npm 
       Autoridad de certificación/CN=npmCA/[email protected]:
       No se puede verificar localmente la autoridad del emisor.

Esto significa que su programa wget no puede verificar https://registry.npmjs.orgel certificado. Hay dos razones que pueden causar este problema:

  1. Su programa wget no tiene el certificado raíz de este dominio. El certificado raíz generalmente se envía con system.
  2. El dominio no incluye el certificado raíz en su certificado.

Entonces, la solución se establece explícitamente en el certificado raíz para https://registry.npmjs.org. Podemos usar openssl para asegurarnos de que el motivo a continuación es el problema.

Prueba openssl s_client -host registry.npmjs.org -port 443en la línea de comando y obtendremos este mensaje (las primeras líneas):

    CONECTADO (00000003)
    profundidad = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    Verifique el error: num = 20: no se puede obtener el certificado del emisor local
    verificar devolución: 0
    ---
    Cadena de certificados
     0 s: / C = EE. UU. / ST = California / L = San Francisco / O = Fastly, Inc./CN=a.sni.fastly.net
       i: / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
     1 s: / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
       i: / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = CA raíz de DigiCert High Assurance EV
    ---

Esta línea verify error:num=20:unable to get local issuer certificatese asegura de que https://registry.npmjs.orgno empaque el certificado raíz. Así que Google DigiCert High Assurance EV Root CAroot Certificate.

nadie0day
fuente
Si solo puede proporcionar el archivo base de texto (como para las compilaciones de Jenkins), este certificado se puede convertir en pem: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas
4

Estaba teniendo el mismo problema. Después de investigar un poco, me di cuenta de que muchos scripts posteriores / previos a la instalación intentarían instalar varias dependencias y, en ocasiones, se utilizan repositorios específicos. Una mejor manera es deshabilitar la verificación de certificados para el módulo https para nodejs que funcionó para mí.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

De esta pregunta

haroon
fuente
2
Como ya se mencionó, esto no solucionará el problema de SSL, solo lo pasará. La forma correcta de abordar esto es configurar correctamente cada paquete (git, npm, nodo) para que confíe en el certificado de firma adecuado. Si está detrás de un proxy corporativo, por supuesto.
Aaron C
0

El problema radica en su proxy. Debido a que el proveedor de ubicación de su paquete de instalación crea su propio certificado y no compra uno verificado de una autoridad aceptada, su proxy no permite el acceso al host de destino. Supongo que omite el proxy cuando usa el navegador Chrome. Entonces no hay verificación.

Hay algunas soluciones a este problema. Pero todo implica que confía en el proveedor del paquete.

Soluciones posibles:

  1. Como se mencionó en otras respuestas, puede realizar un http://acceso que puede eludir su proxy. Eso es un poco peligroso, porque el intermediario puede inyectar malware en sus descargas.
  2. El wgetsugiere que utilice una bandera --no-check-certificate. Esto agregará una directiva de proxy a su solicitud. El proxy, si comprende la directiva, no comprueba si el certificado del servidor está verificado por una autoridad y pasa la solicitud. Quizás haya una configuración con npm que haga lo mismo que la bandera wget.
  3. Configure su proxy para aceptar CA npm. No conozco tu proxy, así que no puedo darte una pista.
Peter Paul Kiefer
fuente
0

establezca la siguiente propiedad:

"conjunto de configuración npm estricto-ssl falso"

Rohit Maurya
fuente
0

Si tiene control sobre el servidor proxy o puede convencer a sus administradores de TI, puede intentar excluir explícitamente registry.npmjs.org de la inspección SSL. Esto debería evitar que los usuarios del servidor proxy tengan que deshabilitar la comprobación de SSL estricto o instalar una nueva CA raíz.

Thiezn
fuente
-1

Esto es lo que puede hacer para evitar npm y usar hilo en la máquina de ventanas.

yarn config set "strict-ssl" false
Ram Kumar Thapa
fuente