Come correggere l'errore del certificato SSL durante l'esecuzione di Npm su Windows?


88

Quando provo a installare un pacchetto con npm, non funziona. Dopo una lunga attesa, alla fine ricevo un errore 'Impossibile stabilire il socket di tunneling, 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)

Tuttavia, quando cerco lo stesso URL nel mio browser web (Google Chrome) si carica correttamente (vedi nota a piè di pagina). https://registry.npmjs.org/coffee-script

Cosa sta succedendo?


Anche se mi capita di utilizzare un proxy https, sono certo che non sia questo il problema. Ho configurato la variabile d'ambiente https_proxy(secondo la guida per l' utente di npm ). So che la variabile d'ambiente è corretta, perché il gestore di pacchetti Python la pipsegue correttamente.

Credo che il problema riguardi i certificati SSL, perché se scarico quell'URL con wget, ottengo un errore esplicito sui certificati

$ 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/emailAddress=i@izs.me':
  Unable to locally verify the issuer's authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

Come posso risolvere questo problema? Senza compromettere la sicurezza.


Ricevo errori di certificato SSL anche nel mio browser web, fino a quando non installavo il certificato "npmCA" come "autorità di certificazione radice attendibile" nelle Opzioni Internet del Pannello di controllo (screenshot inserisci qui la descrizione dell'immagine)


Modifica: ho provato una soluzione non sicura per https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

Eppure scade ancora con lo stesso errore

$ 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

Questo è simile al problema che sto avendo: stackoverflow.com/questions/11773509/...
nwinkler


1
L'immissione di "npm set strict-ssl false" ha risolto un problema
MrD,

Risposte:


143

TL; DR - Esegui questo e non disabilitare la tua sicurezza:

Sostituisci i certificati esistenti

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

# Check the 'cafile'
npm config get cafile

o estendere i certificati esistenti

Imposta questa variabile di ambiente per estendere i certificati predefiniti: NODE_EXTRA_CA_CERTSa"<path to certificate file>"

La storia completa

Ho dovuto lavorare con npm, pip, maven ecc. Dietro un firewall aziendale sotto Windows - non è divertente. Cercherò di mantenere questa piattaforma agnostica / consapevole ove possibile.

HTTP_PROXY e HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXYsono variabili d'ambiente usate da molti software per sapere dove si trova il tuo proxy. In Windows, molti software utilizzano anche il proxy specificato dal sistema operativo che è una cosa completamente diversa. Ciò significa che puoi avere Chrome (che utilizza il proxy specificato nelle tue Opzioni Internet) che si connette all'URL correttamente, ma npm, pip, maven ecc. Non funzionano perché usano HTTPS_PROXY (tranne quando usano HTTP_PROXY - vedi più avanti). Normalmente la variabile d'ambiente sarebbe simile a:

http://proxy.example.com:3128

Ma stai ottenendo un 403 che suggerisce che non sei stato autenticato contro il tuo proxy. Se è l'autenticazione di base sul proxy, ti consigliamo di impostare la variabile di ambiente su qualcosa del formato:

http://user:pass@proxy.example.com:3128

Il temuto NTLM

Esiste un codice di stato HTTP 407 (è richiesta l'autenticazione proxy), che è il modo più corretto per dire che è il proxy piuttosto che il server di destinazione che rifiuta la tua richiesta. Quel codice mi ha tormentato per molto tempo fino a quando, dopo molto tempo su Google, ho scoperto che il mio proxy utilizzava l'autenticazione NTLM . L'autenticazione di base HTTP non era sufficiente per soddisfare qualsiasi proxy installato dai miei superiori aziendali. Ho fatto ricorso a Cntlm sulla mia macchina locale (non autenticata), quindi ho dovuto gestire l'autenticazione NTLM con il proxy a monte. Quindi ho dovuto dire a tutti i programmi che non potevano eseguire NTLM di utilizzare la mia macchina locale come proxy, il che è generalmente semplice come impostare HTTP_PROXYe HTTPS_PROXY. Altrimenti, per l'utilizzo di npm (come suggerisce @Agus):

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

"Dobbiamo decrittografare tutto il traffico HTTPS perché i virus"

Dopo che questo assetto era andato avanti (rumorosamente) per circa un anno, i signori aziendali decisero di cambiare il proxy. Non solo, ma non userebbe più NTLM! Un nuovo mondo coraggioso per essere sicuri. Ma poiché quegli autori di software dannoso ora distribuivano malware tramite HTTPS, l'unico modo in cui potevano proteggere noi poveri utenti innocenti era quello di man-in-the-middle ogni connessione per cercare minacce prima ancora che ci raggiungessero. Come puoi immaginare, sono stato sopraffatto dalla sensazione di sicurezza.

Per farla breve, il certificato autofirmato deve essere installato in npm per evitare SELF_SIGNED_CERT_IN_CHAIN:

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

In alternativa, la NODE_EXTRA_CA_CERTSvariabile di ambiente può essere impostata sul file del certificato.

Penso che sia tutto ciò che so su come far funzionare npm dietro un proxy / firewall. Possa qualcuno trovarlo utile.

Modifica : è un suggerimento molto comune disattivare HTTPS per questo problema utilizzando un registro o un'impostazione HTTP NODE_TLS_REJECT_UNAUTHORIZED. Queste non sono buone idee perché ti stai aprendo a ulteriori attacchi man-in-the-middle o di reindirizzamento. Un rapido spoofing dei tuoi record DNS sulla macchina che esegue l'installazione del pacchetto e ti ritroverai a fidarti dei pacchetti da qualsiasi luogo. Può sembrare molto faticoso far funzionare HTTPS, ma è altamente raccomandato. Quando sei l'unico responsabile per consentire il codice non attendibile nell'azienda, capirai perché.

Modifica 2 : npm config set cafile <path>tieni presente che l'impostazione fa sì che npm utilizzi solo i certificati forniti in quel file, invece di estendere quelli esistenti con esso.

Se si desidera estendere i certificati esistenti (ad esempio con un certificato aziendale), utilizzare la variabile di ambiente NODE_EXTRA_CA_CERTSper collegarsi al file è la strada da percorrere e può farti risparmiare un sacco di problemi. Vedi come-aggiungere-un'autorità-di-certificazione-personalizzata-ca-a-nodejs


9
Su Windows, ho dovuto utilizzare le barre in avanti: npm config set cafile "C: /dev/Firefox/mycert.cer"
John Jesus

4
** Senza segno di uguale= npm config set cafile "<path to your certificate file>"
Moti Winkler

3
Questa è una risposta fantastica - Non potrei riassumere meglio i miei mal di testa riguardo a proxy + zscalar
Jpnh

7
rise così forte a causa di "Come puoi immaginare, sono stato sopraffatto dalla sensazione di sicurezza". :)
Mario B

3
Come ottengo il file del certificato?
Aditya

37

Questo problema è stato risolto per me utilizzando la versione http del repository:

npm config set registry http://registry.npmjs.org/

54
Questa è una pessima soluzione!
KiT O

4
@HaBo Immagino che voglia dire che non è sicuro.
gabeio

3
@KiTO È una cattiva soluzione, d'accordo. Ma perché dovrei dover pasticciare con i problemi del certificato quando voglio solo installare alcuni pacchetti?
Ich

17
Questa risposta è corretta. Ci sono alcuni casi in cui ti trovi dietro il proxy aziendale con la propria catena di certificati in cima ad altre e non c'è altro modo (a parte disabilitare i certificati) di questo (specialmente quando non ti danno i diritti di amministratore). Suona come un bug npm che non carica correttamente le impostazioni corrette dal sistema. Ma per motivi di compatibilità incrociata, non risolveranno l'npm, quindi questo è il risultato. Le persone che dicono che è una cattiva risposta, non hanno idea di cosa stanno parlando.
kenorb

3
@kenorb non è corretto, puoi ripercorrere i passaggi eseguiti dal tuo proxy e aggiungere quei certificati autofirmati alla tua catena con cafile.
dardo

15
npm config set strict-ssl false

ha risolto il problema per me. In questo caso sia il mio agente che il depositario di artefatti si trovano dietro una sottorete privata su aws cloud


Questa soluzione disattiverà SSL per tutte le installazioni, il che rappresenta un rischio per la sicurezza. L'impostazione del registro npm è la soluzione effettiva npm config set registry registry.npmjs.org
Ali

7

Sto avendo lo stesso problema, ho superato l'uso di

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

Ulteriori informazioni su node-doc


6

Mi è capitato di incontrare questo problema SSL simile alcuni giorni fa. Il problema è che il tuo npm non imposta il certificato radice per il certificato utilizzato da https://registry.npmjs.org .

Soluzioni:

  1. Utilizzare wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crtper risolvere il problema di wget
  2. Utilizzare npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtper impostare il certificato radice per il programma npm.

puoi scaricare il certificato radice da: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Avviso: un programma diverso può utilizzare un modo diverso di gestire il certificato radice, quindi non mescolare il browser con altri.

Analisi:

risolviamo prima il tuo wget https://registry.npmjs.org/coffee-scriptproblema. il tuo snippet dice:

        ERRORE: impossibile verificare il certificato di registry.npmjs.org,
        emesso da / C = US / ST = CA / L = Oakland / O = npm / OU = npm 
       Autorità di certificazione/CN=npmCA/emailAddress=i@izs.me:
       Impossibile verificare a livello locale l'autorità dell'emittente.

Ciò significa che il tuo programma wget non può verificare https://registry.npmjs.orgil certificato di. Ci sono due ragioni che possono causare questo problema:

  1. Il tuo programma wget non ha il certificato radice di questo dominio. Il certificato radice di solito viene fornito con il sistema.
  2. Il dominio non impacchetta il certificato radice nel suo certificato.

Quindi la soluzione è impostata esplicitamente per il certificato radice https://registry.npmjs.org. Possiamo usare openssl per assicurarci che il motivo qui sotto sia il problema.

Prova openssl s_client -host registry.npmjs.org -port 443sulla riga di comando e riceveremo questo messaggio (le prime diverse righe):

    CONNESSO (00000003)
    profondità = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    errore di verifica: num = 20: impossibile ottenere il certificato dell'emittente locale
    verifica ritorno: 0
    ---
    Catena di certificati
     0 s: / C = US / 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 = DigiCert High Assurance EV Root CA
    ---

Questa riga verify error:num=20:unable to get local issuer certificateassicura che https://registry.npmjs.orgnon comprenda il certificato radice. Quindi noi Google DigiCert High Assurance EV Root CAroot Certificate.


Se puoi fornire solo il file di base del testo (come per le build Jenkins), questo certificato può essere convertito in pem: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas

4

Ho avuto lo stesso problema. Dopo un po 'di ricerca mi sono reso conto che molti script di post / pre-installazione avrebbero provato a installare varie dipendenze e alcune volte vengono utilizzati repository specifici. Un modo migliore è disabilitare il controllo del certificato per il modulo https per nodejs che ha funzionato per me.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

Da questa domanda


2
Come già accennato, questo non risolverà il problema SSL, lo supererà solo. Il modo corretto per risolvere questo problema è configurare correttamente ogni pacchetto (git, npm, node) in modo che consideri attendibile il certificato di firma appropriato. Se sei dietro un procuratore aziendale, ovviamente.
Aaron C

0

Il problema risiede nel tuo proxy. Poiché il provider di posizione del pacchetto di installazione crea il proprio certificato e non ne acquista uno verificato da un'autorità accettata, il proxy non consente l'accesso all'host di destinazione. Presumo che tu ignori il proxy quando utilizzi il browser Chrome. Quindi non c'è controllo.

Ci sono alcune soluzioni a questo problema. Ma tutto implica che ti fidi del fornitore del pacchetto.

Possibili soluzioni:

  1. Come accennato in altre risposte, puoi effettuare un http://accesso che potrebbe aggirare il tuo proxy. È un po 'pericoloso, perché l'uomo al centro può iniettare malware nei tuoi download.
  2. Il wgetsuggerisce di utilizzare una bandiera --no-check-certificate. Questo aggiungerà una direttiva proxy alla tua richiesta. Il proxy, se comprende la direttiva, non controlla se il certificato del server è verificato da un'autorità e passa la richiesta. Forse esiste una configurazione con npm che fa lo stesso del flag wget.
  3. Configura il tuo proxy per accettare CA npm. Non conosco il tuo procuratore, quindi non posso darti un suggerimento.


0

Questo è ciò che puoi fare per evitare npm e utilizzare il filo nella macchina per finestre.

yarn config set "strict-ssl" false

0

Se hai il controllo sul server proxy o puoi convincere i tuoi amministratori IT, potresti provare a escludere esplicitamente registry.npmjs.org dall'ispezione SSL. Ciò dovrebbe evitare che gli utenti del server proxy debbano disabilitare il controllo strict-ssl o installare una nuova CA radice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.