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 pip
sie korrekt befolgt.
Ich glaube, das Problem betrifft SSL-Zertifikate, denn wenn ich diese URL mit herunterlade, wget
erhalte 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/[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.
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 ).
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
Antworten:
TL; DR - Führen Sie dies einfach aus und deaktivieren Sie Ihre Sicherheit nicht:
Ersetzen Sie vorhandene Zertifikate
oder vorhandene Zertifikate erweitern
Legen Sie diese Umgebungsvariable fest, um vordefinierte Zertifikate zu erweitern:
NODE_EXTRA_CA_CERTS
auf"<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_PROXY
sind 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: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:
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_PROXY
undHTTPS_PROXY
. Andernfalls für npm verwenden (wie @Agus vorschlägt):"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
:Alternativ kann die
NODE_EXTRA_CA_CERTS
Umgebungsvariable 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_CERTS
zum 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-nodejsquelle
=
npm config set cafile "<path to your certificate file>"
Dieses Problem wurde für mich mithilfe der http-Version des Repositorys behoben:
quelle
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
quelle
Ich habe das gleiche Problem, das ich mit überwinden überwinde
Zusätzlich Infos unter Node-Doc
quelle
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:
wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt
diese Option, um das Wget-Problem zu behebennpm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crt
Sie 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-script
Problem beheben . Ihr Snippet sagt:Dies bedeutet, dass Ihr wget-Programm das
https://registry.npmjs.org
Zertifikat nicht überprüfen kann . Es gibt zwei Gründe, die dieses Problem verursachen können: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 443
in der Befehlszeile und wir erhalten diese Meldung (erste Zeilen):Diese Zeile
verify error:num=20:unable to get local issuer certificate
stellt sicher, dasshttps://registry.npmjs.org
kein Stammzertifikat gepackt wird. Also wir GoogleDigiCert High Assurance EV Root CA
Root-Zertifikat.quelle
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
quelle
Legen Sie die folgende Eigenschaft fest:
"npm config set strict-ssl false"
quelle
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:
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.wget
schlä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.quelle