Wie behebe ich einen SSL-Zertifikatfehler, wenn Npm unter Windows ausgeführt wird?


86

Wenn ich versuche, ein Paket mit npm zu installieren, funktioniert es nicht. Nach langem Warten erhalte ich schließlich die Fehlermeldung 'Tunneling-Socket konnte nicht eingerichtet werden, 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)

Wenn ich jedoch in meinem Webbrowser (Google Chrome) zu derselben URL navigiere, wird sie problemlos geladen (siehe Fußnote). https://registry.npmjs.org/coffee-script

Was läuft falsch?


Obwohl ich zufällig einen https-Proxy verwende, bin ich mir sicher, dass dies nicht das Problem ist. Ich habe die Umgebungsvariable konfiguriert https_proxy(gemäß dem npm- Benutzerhandbuch ). Ich weiß, dass die Umgebungsvariable korrekt ist, da der Python-Paketmanager pipsie korrekt befolgt.

Ich glaube, das Problem betrifft SSL-Zertifikate, denn wenn ich diese URL mit herunterlade, wgeterhalte ich einen expliziten Fehler über Zertifikate

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

Wie kann ich das beheben? Ohne die Sicherheit zu gefährden.


Ich habe auch SSL-Zertifikatfehler in meinem Webbrowser erhalten, bis ich das 'npmCA'-Zertifikat als' vertrauenswürdige Stammzertifizierungsstelle 'in den Internetoptionen der Systemsteuerung installiert habe (Screenshot Geben Sie hier die Bildbeschreibung ein).


Bearbeiten: Ich habe eine unsichere Problemumgehung unter https://npmjs.org/doc/config.html#strict-ssl versucht

npm set strict-ssl false

Trotzdem tritt eine Zeitüberschreitung mit demselben Fehler auf

$ 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

Dies ist ähnlich zu dem Problem, das ich habe: stackoverflow.com/questions/11773509/…
nwinkler


Die Eingabe von "npm set strict-ssl false" löste ein Problem
MrD

Antworten:


137

TL; DR - Führen Sie dies einfach aus und deaktivieren Sie Ihre Sicherheit nicht:

Ersetzen Sie vorhandene Zertifikate

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

# Check the 'cafile'
npm config get cafile

oder vorhandene Zertifikate erweitern

Legen Sie diese Umgebungsvariable fest, um vordefinierte Zertifikate zu erweitern: NODE_EXTRA_CA_CERTSauf"<path to certificate file>"

Ganze Geschichte

Ich musste mit npm, pip, maven usw. hinter einer Unternehmensfirewall unter Windows arbeiten - es macht keinen Spaß. Ich werde versuchen, diese Plattform nach Möglichkeit agnostisch / bewusst zu halten.

HTTP_PROXY & HTTPS_PROXY

HTTP_PROXY& HTTPS_PROXYsind Umgebungsvariablen, die von vielen Softwareprogrammen verwendet werden, um zu wissen, wo sich Ihr Proxy befindet. Unter Windows verwendet viele Software auch den vom Betriebssystem angegebenen Proxy, was völlig anders ist. Das bedeutet, dass Chrome (das den in Ihren Internetoptionen angegebenen Proxy verwendet) eine Verbindung zur URL herstellen kann, aber npm, pip, maven usw. nicht funktionieren, da sie HTTPS_PROXY verwenden (außer wenn sie HTTP_PROXY verwenden - siehe später). Normalerweise würde die Umgebungsvariable ungefähr so ​​aussehen:

http://proxy.example.com:3128

Sie erhalten jedoch eine 403, die darauf hinweist, dass Sie nicht gegen Ihren Proxy authentifiziert sind. Wenn es sich um eine Basisauthentifizierung auf dem Proxy handelt, möchten Sie die Umgebungsvariable auf einen Wert in der folgenden Form festlegen:

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

Das gefürchtete NTLM

Es gibt einen HTTP-Statuscode 407 (Proxy-Authentifizierung erforderlich). Dies ist die korrektere Art zu sagen, dass der Proxy und nicht der Zielserver Ihre Anfrage ablehnen. Dieser Code plagte mich am längsten, bis ich nach langer Zeit bei Google erfuhr, dass mein Proxy die NTLM-Authentifizierung verwendet . Die HTTP-Basisauthentifizierung reichte nicht aus, um den von meinen Unternehmensoberhäuptern installierten Proxy zu erfüllen. Ich habe auf meinem lokalen Computer (nicht authentifiziert) auf Cntlm zurückgegriffen und dann die NTLM-Authentifizierung mit dem Upstream-Proxy durchführen lassen. Dann musste ich allen Programmen, die NTLM nicht ausführen konnten, mitteilen, dass sie meinen lokalen Computer als Proxy verwenden sollen - was im Allgemeinen so einfach ist wie das Einstellen von HTTP_PROXYund HTTPS_PROXY. Andernfalls für npm verwenden (wie @Agus vorschlägt):

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

"Wir müssen den gesamten HTTPS-Verkehr entschlüsseln, weil Viren"

Nachdem diese Einrichtung etwa ein Jahr lang (klobig) mitgesummt hatte, beschlossen die Corporate Overlords, den Proxy zu wechseln. Nicht nur das, aber es würde NTLM nicht mehr verwenden! Eine schöne neue Welt, um sicher zu sein. Da diese Autoren von schädlicher Software nun Malware über HTTPS bereitstellten, konnten sie uns armen unschuldigen Benutzern nur schützen, indem sie jede Verbindung in die Mitte stellten, um nach Bedrohungen zu suchen, bevor sie uns überhaupt erreichten. Wie Sie sich vorstellen können, war ich von dem Gefühl der Sicherheit überwältigt.

Um es kurz zu machen, das selbstsignierte Zertifikat muss in npm installiert werden, um Folgendes zu vermeiden SELF_SIGNED_CERT_IN_CHAIN:

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

Alternativ kann die NODE_EXTRA_CA_CERTSUmgebungsvariable auf die Zertifikatdatei gesetzt werden.

Ich denke, das ist alles, was ich darüber weiß, wie man npm hinter einem Proxy / einer Firewall zum Laufen bringt. Möge jemand es nützlich finden.

Bearbeiten : Es ist ein sehr häufiger Vorschlag, HTTPS für dieses Problem entweder mithilfe einer HTTP-Registrierung oder einer Einstellung zu deaktivieren NODE_TLS_REJECT_UNAUTHORIZED. Dies sind keine guten Ideen, da Sie sich weiteren Man-in-the-Middle- oder Umleitungsangriffen öffnen. Wenn Sie Ihre DNS-Einträge auf dem Computer, auf dem die Paketinstallation ausgeführt wird, schnell fälschen, werden Sie Paketen von überall vertrauen. Es scheint viel Arbeit zu sein, HTTPS zum Laufen zu bringen, aber es wird dringend empfohlen. Wenn Sie dafür verantwortlich sind, nicht vertrauenswürdigen Code in das Unternehmen zuzulassen, werden Sie verstehen, warum.

Bearbeiten 2 : npm config set cafile <path>Beachten Sie, dass bei dieser Einstellung npm nur die in dieser Datei bereitgestellten Zertifikate verwendet, anstatt die vorhandenen damit zu erweitern.

Wenn Sie die vorhandenen Zertifikate (z. B. mit einem Unternehmenszertifikat) mithilfe der Umgebungsvariablen NODE_EXTRA_CA_CERTSzum Verknüpfen mit der Datei erweitern möchten, ist dies der richtige Weg und kann Ihnen viel Ärger ersparen. Weitere Informationen finden Sie unter Hinzufügen einer benutzerdefinierten Zertifizierungsstelle-ca-to-nodejs


9
Unter Windows musste ich Schrägstriche verwenden: npm config set cafile "C: /dev/Firefox/mycert.cer"
John Jesus

4
** Ohne Gleichheitszeichen= npm config set cafile "<path to your certificate file>"
Moti Winkler

3
Dies ist eine großartige Antwort - ich konnte meine eigenen Kopfschmerzen in Bezug auf Proxy + Zscalar nicht besser zusammenfassen
Jpnh

7
lachte so heftig wegen "Wie Sie sich vorstellen können, war ich von dem Gefühl der Sicherheit überwältigt." :)
Mario B

3
Wie bekomme ich die Zertifikatdatei?
Aditya

37

Dieses Problem wurde für mich mithilfe der http-Version des Repositorys behoben:

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

50
Das ist eine sehr schlechte Lösung!
KiT O

4
@ HaBo Ich vermute, er meint, das ist unsicher.
gabeio

3
@ KiTO Es ist eine schlechte Lösung, stimmte zu. Aber warum sollte ich mich mit Zertifikatsproblemen herumschlagen müssen, wenn ich nur einige Pakete installieren möchte?
Ich

17
Diese Antwort ist richtig. Es gibt einige Fälle, in denen Sie hinter einem Proxy-Chaos mit einer eigenen Zertifikatskette stehen, und es gibt keinen anderen Weg (außer das Deaktivieren von Zertifikaten überhaupt) als diesen (insbesondere, wenn Sie keine Administratorrechte erhalten). Dies klingt nach einem npm-Fehler, der die richtigen Einstellungen nicht richtig vom System lädt. Aus Gründen der Kreuzkompatibilität wird die npm jedoch nicht repariert, sodass dies das Ergebnis ist. Leute, die sagen, es sei eine schlechte Antwort, haben keine Ahnung, wovon sie sprechen.
Kenorb

3
@kenorb das ist falsch, Sie können die Schritte Ihres Proxys zurückverfolgen und diese selbstsignierten Zertifikate mit cafile zu Ihrer Kette hinzufügen.
Dardo

14
npm config set strict-ssl false

löste das Problem für mich. In diesem Fall befinden sich sowohl mein Agent als auch mein Artefakt-Depot hinter einem privaten Subnetz in der aws-Cloud


6

Ich habe das gleiche Problem, das ich mit überwinden überwinde

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

Zusätzlich Infos unter Node-Doc


6

Ich bin vor ein paar Tagen auf dieses ähnliche SSL-Problem gestoßen. Das Problem ist, dass Ihr npm kein Stammzertifikat für das von https://registry.npmjs.org verwendete Zertifikat festlegt .

Lösungen:

  1. Verwenden Sie wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crtdiese Option, um das Wget-Problem zu beheben
  2. Verwenden npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtSie diese Option, um das Stammzertifikat für Ihr npm-Programm festzulegen.

Sie können das Stammzertifikat herunterladen von: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Hinweis: Unterschiedliche Programme verwenden möglicherweise unterschiedliche Methoden zum Verwalten des Stammzertifikats. Mischen Sie daher keine Browser mit anderen.

Analyse:

Lassen Sie uns zuerst Ihr wget https://registry.npmjs.org/coffee-scriptProblem beheben . Ihr Snippet sagt:

        FEHLER: Das Zertifikat von registry.npmjs.org kann nicht überprüft werden.
        ausgestellt von / C = US / ST = CA / L = Oakland / O = npm / OU = npm 
       Certificate Authority/CN=npmCA/emailAddress=i@izs.me:
       Die Berechtigung des Ausstellers kann nicht lokal überprüft werden.

Dies bedeutet, dass Ihr wget-Programm das https://registry.npmjs.orgZertifikat nicht überprüfen kann . Es gibt zwei Gründe, die dieses Problem verursachen können:

  1. Ihr wget-Programm verfügt nicht über das Stammzertifikat dieser Domain. Das Stammzertifikat wird normalerweise mit dem System geliefert.
  2. Die Domain packt kein Stammzertifikat in sein Zertifikat.

Die Lösung ist also explizit als Stammzertifikat festgelegt https://registry.npmjs.org. Wir können openssl verwenden, um sicherzustellen, dass der Grund unten das Problem ist.

Versuchen Sie es openssl s_client -host registry.npmjs.org -port 443in der Befehlszeile und wir erhalten diese Meldung (erste Zeilen):

    VERBUNDEN (00000003)
    Tiefe = 1 / C = US / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    Überprüfungsfehler: num = 20: Lokales Ausstellerzertifikat kann nicht abgerufen werden
    Rückgabe überprüfen: 0
    --- ---.
    Zertifikatskette
     0 s: / C = US / ST = Kalifornien / 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 EV-Stammzertifizierungsstelle mit hoher Sicherheit
    --- ---.

Diese Zeile verify error:num=20:unable to get local issuer certificatestellt sicher, dass https://registry.npmjs.orgkein Stammzertifikat gepackt wird. Also wir Google DigiCert High Assurance EV Root CARoot-Zertifikat.


Wenn Sie nur die Textbasisdatei bereitstellen können (wie bei Jenkins-Builds), kann dieses Zertifikat in pem konvertiert werden: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas

4

Ich hatte das gleiche Problem. Nach einigem Graben wurde mir klar, dass viele Skripte nach / vor der Installation versuchen würden, verschiedene Abhängigkeiten zu installieren, und manchmal werden bestimmte Repositorys verwendet. Eine bessere Möglichkeit besteht darin, die Zertifikatprüfung für das https-Modul für NodeJS zu deaktivieren, die für mich funktioniert haben.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

Aus dieser Frage


2
Wie bereits erwähnt, wird das SSL-Problem dadurch nicht behoben , sondern nur umgangen. Der richtige Weg, dies zu beheben, besteht darin, jedes Paket (git, npm, node) so zu konfigurieren, dass es dem richtigen Signaturzertifikat vertraut. Wenn Sie hinter einem Coporate-Proxy stehen, natürlich.
Aaron C

1

Legen Sie die folgende Eigenschaft fest:

"npm config set strict-ssl false"


0

Das Problem liegt auf Ihrem Proxy. Da der Standortanbieter Ihres Installationspakets ein eigenes Zertifikat erstellt und kein verifiziertes von einer akzeptierten Behörde kauft, erlaubt Ihr Proxy keinen Zugriff auf den Zielhost. Ich gehe davon aus, dass Sie den Proxy umgehen, wenn Sie den Chrome-Browser verwenden. Es findet also keine Überprüfung statt.

Es gibt einige Lösungen für dieses Problem. Alle implizieren jedoch, dass Sie dem Paketanbieter vertrauen.

Mögliche Lösungen:

  1. Wie in anderen Antworten erwähnt, können Sie einen http://Zugriff vornehmen, der Ihren Proxy umgehen kann. Das ist ein bisschen gefährlich, weil der Mann in der Mitte Malware in Ihre Downloads injizieren kann.
  2. Das wgetschlägt vor, dass Sie eine Flagge verwenden --no-check-certificate. Dadurch wird Ihrer Anfrage eine Proxy-Direktive hinzugefügt. Wenn der Proxy die Direktive versteht, prüft er nicht, ob das Serverzertifikat von einer Behörde überprüft wurde, und leitet die Anforderung weiter. Vielleicht gibt es eine Konfiguration mit npm, die dasselbe tut wie das wget-Flag.
  3. Sie konfigurieren Ihren Proxy so, dass er CA npm akzeptiert. Ich kenne Ihren Proxy nicht, daher kann ich Ihnen keinen Hinweis geben.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.