błąd odbioru: „Błąd: błąd SSL: SELF_SIGNED_CERT_IN_CHAIN” podczas korzystania z npm

292

Używam npm v1.0.104 / node 0.6.12 na Ubuntu - otrzymuję błąd skopiowany poniżej podczas próby instalacji jakichkolwiek nowych modułów przez npm (wcześniej testowałem socket.io używając http, nie https i zastanawiam się, czy to mogłoby spowodowały problem z certyfikatami npm / unsigned). Błąd pojawia się, gdy npm próbuje rozwiązać adres URL „ https://registry.npmjs.org ”. Czy w każdym razie mogę zignorować błąd lub zlokalizować / dodać certyfikat do zaufanego sklepu, aby kontynuować używanie npm.

Doceniony zostanie każdy wgląd w to, co należy zrobić, aby rozwiązać problem (wolałbym rozwiązać problem poprzez konfigurację, a nie ponowną instalację, jeśli to możliwe).

Błąd: „Błąd: błąd SSL: SELF_SIGNED_CERT_IN_CHAIN”

Pełna wiadomość:

npm ERR! Error: SSL Error: SELF_SIGNED_CERT_IN_CHAIN
npm ERR!     at ClientRequest.<anonymous> (/usr/lib/node_modules/npm/node_modules/request/main.js:252:28)
npm ERR!     at ClientRequest.emit (events.js:67:17)
npm ERR!     at HTTPParser.onIncoming (http.js:1261:11)
npm ERR!     at HTTPParser.onHeadersComplete (http.js:102:31)
npm ERR!     at CleartextStream.ondata (http.js:1150:24)
npm ERR!     at CleartextStream._push (tls.js:375:27)
npm ERR!     at SecurePair.cycle (tls.js:734:20)
npm ERR!     at EncryptedStream.write (tls.js:130:13)
npm ERR!     at Socket.ondata (stream.js:38:26)
npm ERR!     at Socket.emit (events.js:67:17)
npm ERR! Report this *entire* log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! 
npm ERR! System Linux 2.6.38-13-generic
npm ERR! command "node" "/usr/bin/npm" "install" "jed"
npm ERR! node -v v0.6.12
npm ERR! npm -v 1.0.104
Ali Haider
źródło
1
Nie usuwaj ścisłego protokołu SSL. Spójrz na stackoverflow.com/a/16534065
nolim1t
15
Od 27 lutego 2014 r. Npm nie obsługuje już certyfikatów z podpisem własnym.Więcej informacji można znaleźć na blogu npm lub w najnowszej odpowiedzi poniżej.
Kevin Reilly,
1
W przypadku problemów z AWS Elastic Beanstalk rozwiązanie jest dostępne tutaj: stackoverflow.com/questions/22096459/...
Guillaume Flandre
1
nolim1t : nie rozwiązuje to przyczyny problemu, a Kevin : polecenia w blogu są niekompletne. Zobacz stackoverflow.com/a/22099006/106302 dla poleceń, które pracowały dla mnie.
We Are All Monica
1
@ali PROSZĘ zmienić „Zaakceptowaną odpowiedź” Ten problem pojawia się z powodu aktualizacji npm, a nie problemu z SSL. Wyłączanie protokołu SSL jest ZŁE, a zwłaszcza, że ​​obecnie poprawną odpowiedzią jest aktualizacja npm. Odpowiedź Kevina Reilly powinna być odpowiedzią zaakceptowaną. Dziękuję Ci.
Mikezx6r

Odpowiedzi:

391

Uruchomienie następujących pomogło rozwiązać problem:

npm config set strict-ssl false

Nie mogę komentować, czy w tym momencie spowoduje to jakiekolwiek inne problemy. Mam nadzieję, że to pomoże.

Ali Haider
źródło
39
zamiast tego uruchom „npm config set ca null”, ignorowanie błędów ssl to zły pomysł
alex
6
@SnowInferno SSL gwarantuje również, że rozmawiasz z prawdziwym register.npmjs.org. Ktoś mógłby potencjalnie zainstalować złośliwe pakiety.
adotout
58
To jest wstrętnie złe. Dlaczego w ogóle przeszkadzasz w korzystaniu z protokołu SSL, jeśli za każdym razem robi to jedyną rzecz, którą powinien zrobić, aby go wyłączyć? „Za każdym razem, gdy zignorowanie błędu prowadzi do sukcesu, programiści właśnie to zrobią”.
djechlin
20
Nie ignoruj ​​problemów z ssl, ponieważ błąd występuje z bardzo dobrego powodu. Trochę wyszukiwania zaowocowało następującym tweetem, który prowadzi do oficjalnego rozwiązania Twojego problemu (aktualizacja npm): twitter.com/npmjs/status/439279809307242496
Thomas Vervest
41
Mój problem został spowodowany przez serwer proxy, za którym jestem, „npm config set ca null” i „npm config set ca” ”nadal dawały ten sam błąd, ale usunięcie SSL działało idealnie. Czasami dobra praktyka nie jest tak ważna jak to, co faktycznie działa.
Cory Schulz
220

Od 27 lutego 2014 r. Npm nie obsługuje już certyfikatów z podpisem własnym .Następujące opcje, zgodnie z zaleceniami npm, to wykonanie jednej z następujących czynności:

Zaktualizuj swoją wersję npm

npm install npm -g --ca=""

- LUB -

Poinformuj swoją obecną wersję npm, aby korzystała ze znanych rejestratorów

npm config set ca ""

Aktualizacja: npm opublikował więcej pomocy dla SELF_SIGNED_CERT_IN_CHAIN ​​i npm z większą ilością rozwiązań specyficznych dla różnych środowisk



Konieczne może być przygotowanie się sudodo zaleceń.


Inne opcje

Wygląda na to, że ludzie mają problemy z używaniem rekomendacji npm, więc oto inne potencjalne rozwiązania.

Uaktualnij sam węzeł
Otrzymanie tego błędu może sugerować, że masz starszą wersję węzła, która naturalnie pochodzi ze starszej wersji npm. Jednym z rozwiązań jest aktualizacja wersji Node. Jest to prawdopodobnie najlepsza opcja, ponieważ aktualizuje i usuwa istniejące błędy i luki w zabezpieczeniach.

Ten proces zależy od tego, jak zainstalowałeś Węzeł, system operacyjny i inne.

Zaktualizuj npm
Ponieważ prawdopodobnie dotarłeś tutaj podczas próby installpakietu, możliwe, że wystąpi npm install npm -gbłąd z tym samym błędem. W takim przypadku użyj updatezamiast tego. Zgodnie z sugestią Nisantha Sojana:

npm update npm -g

Zaktualizuj alternatywę npm
Jednym ze sposobów rozwiązania problemu jest użycie znanych rejestratorów, instalacja, a następnie zaprzestanie korzystania ze znanych rejestratorów. Zgodnie z sugestią jnylena:

npm config set ca ""
npm install npm -g
npm config delete ca
Kevin Reilly
źródło
10
Najłatwiejszym rozwiązaniem jest prawdopodobnie pobranie najnowszej wersji samego Nodejsa, zawiera nową wersję npm, w której problem został rozwiązany. Żadne z powyższych poleceń nie działało dla mnie.
Strille
1
Idę z tym rozwiązaniem, ponieważ jest to pierwsze, które nie ignoruje ssl (albo ustawiając czek na false w konfiguracji lub używając zamiast tego http). Dzięki!
hcpl
12
instalacja npm npm -g daje mi również błąd SELF_SIGNED_CERT_IN_CHAIN
Anders Bornholm
3
Jeśli to nie zadziała, npm config set ca ""najpierw wykonaj aktualizację, a następnie cofnij zmianę konfiguracji. Zobacz: stackoverflow.com/a/22099006/106302
We Are All Monica
1
@ Redsandro sudozmienia użytkownika, -gustawia flagi, jeśli ma być instalowany globalnie dla tego użytkownika lub tylko lokalnie node_modules.
Radek
68

Na razie właśnie zmieniłem adres URL rejestru z https na http. Lubię to:

npm config set registry="http://registry.npmjs.org/"
Hermann
źródło
1
Dla mnie zadziałało jak urok. Nie chciałem stracić oryginalnego urzędu certyfikacji ani zmusić go do ignorowania błędów SSL.
SnowInferno
Działał idealnie. Dzięki!
muhammed basil
13
Wyłączenie bezpieczeństwa nie może być rozwiązaniem!
Alessandro Pezzato
1
Wcześniej z niego korzystałem, ale z jakiegoś powodu przełączenie go z powrotem na „https: //” z „http: //” sprawiło, że moje znów działało.
kshreve
Po wypróbowaniu wszystkich innych rozwiązań, ta praca dla mnie w końcu :-)
Swapnil Kadu
49
npm config set strict-ssl false -g

Aby zapisać go globalnie

Rudzik
źródło
Robienie tego daje mi niesławny cb() never called!błąd npm
Jeremy
Po tym ustawieniu przechodzę poniżej błędu npm ERR! kod E401 npm ERR! Nie można uwierzytelnić, potrzebne: Negocjuj, NTLM npm ERR! Pełny dziennik tego uruchomienia można znaleźć w: npm ERR! C: \ BuildAgent \ npm-cache_logs \ 2019-06-24T10_23_46_563Z-debug.log
Shami Qureshi
31

Musisz zaktualizować npm.

// Do this first, or the upgrade will fail
npm config set ca ""

npm install npm -g

// Undo the previous config change
npm config delete ca

Może być konieczne poprzedzenie tych poleceń znakiem sudo.

Źródło: http://blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more

Wszyscy jesteśmy Monicą
źródło
@Oliver Salzburg: re. twoja edycja: w OS XI nie sądzę, że sudojest to w ogóle wymagane, a tylko prefiks polecenia upgrade sudodziałał dobrze dla mnie. YMMV.
We Are All Monica
Ach, to zadziałało dla mnie. Dzięki za szczegółowe instrukcje cofania zmiany konfiguracji (więc nie musiałem jej wykopywać)!
Matt
Ciekawy. Dokonałem edycji dopiero po przetestowaniu tego na serwerze Debian. Podoba mi się jednak bieżąca wersja;)
Der Hochstapler
Ubuntu / Debian wymaga dodatkowego linkowania, patrz moja odpowiedź poniżej.
Redsandro
2
To powinno być przyjęte rozwiązanie. Nie wyłącza to bezpieczeństwa i jest to „oficjalne” rozwiązanie opisane w blogu npm.
Alessandro Pezzato
21

Błąd SELF_SIGNED_CERT_IN_CHAINoznacza, że ​​masz samopodpisany certyfikat w łańcuchu certyfikatów, który zasadniczo nie jest zaufany przez system.

Jeśli tak się stanie, dzieje się coś podejrzanego, dlatego, jak to już skomentowali ludzie, nie zaleca się wyłączania sprawdzania certyfikatów, ale lepszym rozwiązaniem jest zrozumienie problemu i usunięcie przyczyny.

Może to dotyczyć albo:

  • niestandardowy adres repozytorium, który nie ma odpowiedniego certyfikatu,

  • sieć korporacyjna z transparentnym proxy.

    Jeśli jesteś za serwerem proxy WWW firmowej, należy ustawić się prawidłowego HTTP_PROXY/ HTTPS_PROXYzmienne środowiskowe lub ustawić je poprzez npm:

    npm config set proxy http://proxy.company.com:8080
    npm config set https-proxy http://proxy.company.com:8080

    Zobacz: Jak skonfigurować Node.js i Npm za korporacyjnym proxy sieciowym

Jeśli ufasz hostowi, możesz wyeksportować samopodpisany certyfikat z łańcucha i zaimportować go do systemu, aby były one oznaczone jako zaufane.

Można to osiągnąć sprawdzając certyfikaty przez (zmiana example.comna repozytorium npm, które kończy się niepowodzeniem na podstawie npm-debug.log):

openssl s_client -showcerts -connect example.com:443 < /dev/null

następnie zapisz treść certyfikatu (pomiędzy BEGINi END) do .crtpliku, aby go zaimportować.

Linux

Zgodnie z sugestią możesz dodać wyeksportowany certyfikat do /etc/environmentpliku (Węzeł 7.4+), na przykład:

NODE_EXTRA_CA_CERTS=/etc/pki/ca-trust/source/anchors/yourCer‌​ts.pem

CentOS

W CentOS 5 można to dołączyć do /etc/pki/tls/certs/ca-bundle.crtpliku, np

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq | sudo tee -a /etc/pki/tls/certs/ca-bundle.crt
sudo update-ca-trust force-enable
sudo update-ca-trust extract
npm install

Uwaga: aby wyeksportować tylko pierwszy certyfikat, usuń gna początku.

W CentOS 6 plik certyfikatu można skopiować /etc/pki/ca-trust/source/anchors/.

Ubuntu / Debian

W Ubuntu / Debian skopiuj plik CRT, /usr/local/share/ca-certificates/ a następnie uruchom:

sudo update-ca-certificates

System operacyjny Mac

W macOS możesz uruchomić:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/foo.crt

Windows

W systemie Windows: certutil -addstore -f "ROOT" new-root-certificate.crt


Zobacz też: npm - Rozwiązywanie problemów - Błąd SSL

kenorb
źródło
1
> W takim przypadku musisz wyeksportować samopodpisany certyfikat z łańcucha i zaimportować go do systemu, aby zostały oznaczone jako zaufane. - To dla mnie sztuczka.
dmi3y
2
Świetny! Pomaga także dodać NODE_EXTRA_CA_CERTS = / etc / pki / ca-trust / source / anchors / yourCerts.pem do środowiska / etc /. Węzeł 7.4+ bierze to pod uwagę
ph4r05
9

Umieszczenie tego przed poleceniem wydaje się działać NODE_TLS_REJECT_UNAUTHORIZED=0. dawny:NODE_TLS_REJECT_UNAUTHORIZED=0 npm ...

Najlepiej byłoby dowiedzieć się, jak sprawić, aby węzeł widział samopodpisany certyfikat jako ważny. Powyższa sugestia strict-ssl nie działała dla mnie z jakiegoś powodu. Jeśli rozumiesz implikacje dla bezpieczeństwa i potrzebujesz tymczasowej szybkiej poprawki, to znalazłem w niektórych przypadkowych problemach z github podczas wyszukiwania błędu w Google.

Adam Lane
źródło
1
w systemie Windows użyj „set NODE_TLS_REJECT_UNAUTHORIZED = 0”. A potem działa jak urok !!
Tarun
8

Repozytorium nie obsługuje już certyfikatów z podpisem własnym. Musisz zaktualizować npm.

// Disable the certificate temporarily in order to do the upgrade
npm config set ca ""

// Upgrade npm. -g (global) means you need root permissions; be root 
// or prepend `sudo`
sudo npm install npm -g

// Undo the previous config change
npm config delete ca

// For Ubuntu/Debian-sid/Mint, node package is renamed to nodejs which 
// npm cannot find. Fix this:
sudo ln -s /usr/bin/nodejs /usr/bin/node

Musisz otworzyć nową sesję terminala, aby skorzystać z zaktualizowanej npm.

Źródło: pierwotnie była to edycja odpowiedzi Jnylena . Mimo że wytyczne mówią „Przyjmujemy z zadowoleniem wszystkie konstruktywne zmiany, ale prosimy o ich znaczne uzupełnienie”, edycja została odrzucona z powodu „Ta zmiana zmienia się zbytnio w oryginalnym poście; oryginalne znaczenie lub zamiar tego wpisu zostanie utracony”. Wydaje mi się, że społeczność woli osobną odpowiedź.

Redsandro
źródło
To zadziałało dla mnie. Jednak nie muszę ostatnią komendę: sudo ln -s /usr/bin/nodejs /usr/bin/node.
absynce
1
Prawdopodobnie zależy to od tego, czy zainstalowałeś się z oficjalnych repozytoriów Ubuntu, repozytorium strony trzeciej (dla nowszej wersji), czy sam się skompilowałeś (dla najnowszej wersji).
Redsandro
7

Dla tych, którzy na komputerze Mac z tym samym problemem i zainstalowali npm przez homebrew :

brew uninstall npm

następnie

brew install npm

Działa dla mnie na OSX (10.9.1)

EDYCJA : Może być konieczne brew updateprzed zainstalowaniem npm. Możesz także zrobić brew upgradepo aktualizacji homebrew. Pomocne może być również uruchomienie, brew doctorjeśli napotkasz jakiekolwiek inne problemy.

Patrick
źródło
4

Szybkie i czyste rozwiązanie (testowane pod Linuksem) (po fatidic 27 lutego 2014)


Odinstaluj npm

npm rm npm -g

Zainstaluj npm (nowy adres URL to www.npmjs.org zamiast npmjs.org )

curl https://www.npmjs.org/install.sh | sh

Wskazówka : jak zainstalować node.js w systemie Linux https://stackoverflow.com/a/22099363/333061

Igor Parra
źródło
Polecenie nie działa już z powodu przekierowania 301, ale nadal możesz pisać https://www.npmjs.org/install.shw przeglądarce i pobierać je przed uruchomieniem ręcznie.
svassr
Lub uruchom curl z flagą -L
Evan Cordell
poprzednie curl https://npmjs.org/install.shpolecenie przekierowuje do https://www.npmjs.org/install.shwłaśnie dlatego curl https://www.npmjs.org/install.sh | shdziała bezproblemowo. jest OK, aby zainstalować od teraz na małym padawan. :)
Igor Parra
2

Wyłączenie SSL wydaje się bardzo złym pomysłem. Blog npm wyjaśnia, że ​​nie obsługują już samopodpisanego certyfikatu. Sugerują aktualizację npm przez npm install npm -g, ale oczywiście dostałem ten sam błąd SELF_SIGNED_CERT_IN_CHAIN. Właśnie zaktualizowałem węzeł, który wraz z nim zaktualizował npm. Dokładna procedura zależy przede wszystkim od sposobu zainstalowania węzła.

Jeremiasz Orr
źródło