146 votes

Comment corriger l'erreur de certificat SSL lors de l'exécution de Npm sous Windows ?

Lorsque j'essaie d'installer un paquet avec npm, cela ne fonctionne pas. Après une longue attente, j'obtiens finalement une erreur 'tunneling socket could not be established, 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)

Cependant, lorsque je navigue vers cette même URL dans mon navigateur web (Google Chrome), elle se charge correctement (voir note de bas de page). https://registry.npmjs.org/coffee-script

Qu'est-ce qui ne va pas ?


Bien que j'utilise un proxy https, je suis sûr que ce n'est pas le problème. J'ai configuré la variable d'environnement https_proxy (selon les règles de npm guide de l'utilisateur ). Je sais que la variable d'environnement est correcte, car le gestionnaire de paquets Python pip le suit correctement.

Je pense que le problème est lié aux certificats SSL, car si je télécharge cette URL avec wget j'obtiens une erreur explicite concernant les certificats

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

Comment puis-je réparer cela ? Sans compromettre la sécurité.


J'avais l'habitude d'obtenir des erreurs de certificat SSL dans mon navigateur web aussi, jusqu'à ce que j'installe le certificat 'npmCA' comme 'autorité de certification racine de confiance' dans les Options Internet du Panneau de configuration (capture d'écran enter image description here )


Edit : J'ai essayé un insécurité solution de contournement par https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

Pourtant, il se termine toujours avec la même erreur

$ 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

255voto

Alex Taylor Points 5098

TL;DR - Exécutez juste ça et ne désactivez pas votre sécurité :

Remplacer les certificats existants

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

# Check the 'cafile'
npm config get cafile

ou étendre les certificats existants

Définissez cette variable d'environnement pour étendre les certitudes prédéfinies : NODE_EXTRA_CA_CERTS a "<path to certificate file>"

Article complet

J'ai eu à travailler avec npm, pip, maven etc. derrière un pare-feu d'entreprise sous Windows - ce n'est pas drôle. Je vais essayer de rester agnostique et conscient de la plateforme dans la mesure du possible.

HTTP_PROXY & HTTPS_PROXY

HTTP_PROXY & HTTPS_PROXY sont des variables d'environnement utilisées par de nombreux logiciels pour savoir où se trouve votre proxy. Sous Windows, de nombreux logiciels utilisent également le proxy spécifié par votre système d'exploitation, ce qui est totalement différent. Cela signifie que Chrome (qui utilise le proxy spécifié dans vos Options Internet) peut se connecter à l'URL sans problème, mais que npm, pip, maven, etc. ne fonctionnent pas parce qu'ils utilisent HTTPS_PROXY (sauf quand ils utilisent HTTP_PROXY - voir plus loin). Normalement, la variable d'environnement devrait ressembler à quelque chose comme :

http://proxy.example.com:3128

Mais vous obtenez un 403 ce qui suggère que vous n'êtes pas authentifié par votre proxy. S'il s'agit d'une authentification de base sur le proxy, vous voudrez définir la variable d'environnement à quelque chose de la forme :

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

Le redoutable NTLM

Il y a un code d'état HTTP 407 (authentification du proxy requise), ce qui est la façon plus correcte de dire que c'est le proxy plutôt que le serveur de destination qui rejette votre demande. Ce code m'a longtemps tourmenté jusqu'à ce qu'après avoir passé beaucoup de temps sur Google, j'apprenne que mon proxy utilisait Authentification NTLM . L'authentification de base HTTP ne suffisait pas à satisfaire le proxy que mes supérieurs avaient installé. J'ai eu recours à l'utilisation de Cntlm sur ma machine locale (non authentifiée), puis il a géré l'authentification NTLM avec le proxy en amont. Ensuite, j'ai dû dire à tous les programmes qui ne pouvaient pas utiliser NTLM d'utiliser ma machine locale comme proxy - ce qui est généralement aussi simple que de paramétrer HTTP_PROXY y HTTPS_PROXY . Sinon, pour une utilisation npm (comme le suggère @Agus) :

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

"Nous devons décrypter tout le trafic HTTPS à cause des virus."

Après que ce système ait fonctionné (de manière inefficace) pendant environ un an, les dirigeants de l'entreprise ont décidé de modifier la procuration. Non seulement cela, mais il n'utiliserait plus NTLM ! Un nouveau monde courageux pour être sûr. Mais comme les auteurs de logiciels malveillants diffusaient désormais leurs programmes malveillants via HTTPS, la seule façon de nous protéger, nous, pauvres utilisateurs innocents, était de s'immiscer dans chaque connexion pour analyser les menaces avant même qu'elles ne nous atteignent. Comme vous pouvez l'imaginer, j'étais envahi par un sentiment de sécurité.

Pour faire court, le certificat auto-signé doit être installé dans npm afin d'éviter SELF_SIGNED_CERT_IN_CHAIN :

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

Alternativement, le NODE_EXTRA_CA_CERTS peut être définie comme le fichier de certificat.

Je pense que c'est tout ce que je sais pour faire fonctionner npm derrière un proxy/pare-feu. J'espère que quelqu'un trouvera cela utile.

Modifier : C'est une suggestion très courante de désactiver HTTPS pour ce problème, soit en utilisant un registre HTTP ou en définissant NODE_TLS_REJECT_UNAUTHORIZED . Ce ne sont pas de bonnes idées car vous vous exposez à d'autres attaques de type "man-in-the-middle" ou redirection. Une rapide usurpation de vos enregistrements DNS sur la machine qui effectue l'installation du paquet et vous pourrez faire confiance aux paquets provenant de n'importe où. Faire fonctionner le HTTPS peut sembler être un travail considérable, mais c'est fortement recommandé. Lorsque vous serez responsable de l'introduction de code non fiable dans l'entreprise, vous comprendrez pourquoi.

Edit 2 : Gardez à l'esprit que le réglage npm config set cafile <path> permet à npm de n'utiliser que les certitudes fournies dans ce fichier, au lieu d'étendre les certitudes existantes.

Si vous voulez étendre les certificats existants (par exemple avec un certificat d'entreprise) en utilisant la variable d'environnement NODE_EXTRA_CA_CERTS pour établir un lien avec le fichier est la meilleure solution et peut vous éviter bien des tracas. Voir comment-ajouter-une-autorité-de-certificat-personnalisée-au-nodejs

39voto

npm config set strict-ssl false

a résolu le problème pour moi. Dans ce cas, mon agent et mon dépôt d'artefacts se trouvent derrière un sous-réseau privé sur le nuage d'aws.

34voto

Ehsan Points 1053

Ce problème a été résolu pour moi en utilisant la version http du référentiel :

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

10voto

nobody0day Points 170

J'ai rencontré ce problème SSL similaire il y a quelques jours. Le problème est que votre npm n'a pas défini de certificat racine pour le certificat utilisé par l'application https://registry.npmjs.org .

Solutions :

  1. Utilice wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt pour résoudre le problème de wget
  2. Utilice npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crt pour définir un certificat racine pour votre programme npm.

vous pouvez télécharger le certificat racine à partir de : https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Avis : Chaque programme peut utiliser une manière différente de gérer le certificat racine, donc ne mélangez pas les navigateurs avec les autres.

Analyse :

réparons votre wget https://registry.npmjs.org/coffee-script Le premier problème est que votre extrait de code dit :

        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.

Cela signifie que votre programme wget ne peut pas vérifier https://registry.npmjs.org Le certificat de l'entreprise. Deux raisons peuvent être à l'origine de ce problème :

  1. Votre programme wget ne possède pas le certificat racine de ce domaine. Le certificat racine est généralement livré avec le système.
  2. Le domaine n'inclut pas le certificat racine dans son certificat.

La solution est donc de définir explicitement un certificat racine pour https://registry.npmjs.org . Nous pouvons utiliser openssl pour nous assurer que la raison ci-dessous est le problème.

Essayez openssl s_client -host registry.npmjs.org -port 443 sur la ligne de commande et nous obtiendrons ce message (les premières lignes) :

    CONNECTED(00000003)
    depth=1 /C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert High Assurance CA-3
    verify error:num=20:unable to get local issuer certificate
    verify return:0
    ---
    Certificate chain
     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
    ---

Cette ligne verify error:num=20:unable to get local issuer certificate s'assure que https://registry.npmjs.org ne contient pas de certificat racine. Nous avons donc cherché sur Google DigiCert High Assurance EV Root CA Certificat racine.

8voto

Agus Points 693

J'ai résolu le problème en utilisant

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

Plus d'informations sur node-doc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X