Як виправити помилку сертифіката SSL під час запуску Npm у Windows?


88

Коли я намагаюся встановити пакет з npm, це не працює. Після довгого очікування, врешті-решт, я отримую повідомлення про помилку `` неможливо встановити тунельний сокет, 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)

Однак, коли я переглядаю ту саму URL-адресу у своєму веб-браузері (Google Chrome), вона завантажується нормально (див. Виноску). https://registry.npmjs.org/coffee-script

Що йде не так?


Хоча я випадково використовую https-проксі, я впевнений, що це не проблема. Я налаштував змінну середовища https_proxy(згідно з посібником користувача npm ). Я знаю, що змінна середовища є правильною, оскільки менеджер пакунків Python pipслідує за нею правильно.

Я вважаю, що проблема пов'язана із сертифікатами SSL, тому що якщо я завантажу URL-адресу за допомогою wget, я отримую явну помилку щодо сертифікатів

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

Як я можу це виправити? Без шкоди для безпеки.


Раніше я також отримував помилки сертифіката SSL у своєму веб-браузері, поки не встановив сертифікат 'npmCA' як `` довірений орган кореневої сертифікації '' в `` Властивостях браузера '' (знімок екрана введіть тут опис зображення)


Редагувати: я спробував небезпечний обхідний шлях за https://npmjs.org/doc/config.html#strict-ssl

npm set strict-ssl false

Тим не менше, він все одно закінчується з тією ж помилкою

$ 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

Це схоже на мене питання: stackoverflow.com/questions/11773509 / ...
nwinkler

1
Привіт. Дивіться також github.com/isaacs/npm/issues/2728
Полковник Панік,

Введення "npm set strict-ssl false" вирішило проблему
MrD

Відповіді:


142

TL; DR - Просто запустіть це і не відключайте свою безпеку:

Замініть існуючі сертифікати

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

# Check the 'cafile'
npm config get cafile

або розширити існуючі сертифікати

Встановіть цю змінну середовища для розширення попередньо визначених сертифікатів: NODE_EXTRA_CA_CERTSдо"<path to certificate file>"

Повна історія

Мені доводилося працювати з npm, pip, maven тощо за корпоративним брандмауером під Windows - це не цікаво. Я спробую тримати цю платформу агностичною / поінформованою, де це можливо.

HTTP_PROXY & HTTPS_PROXY

HTTP_PROXY& - HTTPS_PROXYце змінні середовища, що використовуються багатьма програмами, щоб знати, де знаходиться ваш проксі. В ОС Windows багато програм також використовує вказаний вами ОС проксі-сервер, що зовсім інша річ. Це означає, що ви можете мати Chrome (який використовує проксі-сервер, вказаний у Ваших параметрах браузера), що нормально підключається до URL-адреси, але npm, pip, maven тощо не працює, оскільки вони використовують HTTPS_PROXY (крім випадків, коли вони використовують HTTP_PROXY - див. Пізніше). Зазвичай змінна середовища буде виглядати приблизно так:

http://proxy.example.com:3128

Але ви отримуєте 403, що означає, що ви не проходите автентифікацію проти вашого проксі. Якщо це основна автентифікація на проксі, ви хочете встановити змінну середовища у щось у формі:

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

Страшний NTLM

Існує код стану HTTP 407 (потрібна автентифікація проксі-сервера), що є більш правильним способом сказати, що саме проксі-сервер, а не сервер призначення, який відхиляє ваш запит. Цей код переслідував мене найдовше, поки через багато часу в Google я не дізнався, що мій проксі використовував автентифікацію NTLM . Базової автентифікації HTTP було недостатньо, щоб задовольнити будь-який проксі, встановлений моїми корпоративними адміністраторами. Я вдався до використання Cntlm на моєму локальному комп'ютері (неаутентифікований), а потім попросив його обробити автентифікацію NTLM за допомогою проксі-сервера вище. Потім мені довелося сказати всім програмам, які не могли зробити NTLM, використовувати мою локальну машину в якості проксі-сервера - що, як правило, так само просто, як налаштування HTTP_PROXYі HTTPS_PROXY. В іншому випадку, для використання npm (як пропонує @Agus):

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

"Нам потрібно розшифрувати весь трафік HTTPS, оскільки віруси"

Після того, як ця організація гуділа (незграбно) близько року, корпоративні керівники вирішили змінити довірену особу. Мало того, але він більше не використовуватиме NTLM! Напевно, хоробрий новий світ. Але оскільки ці автори зловмисного програмного забезпечення зараз постачали шкідливе програмне забезпечення через HTTPS, єдиним способом захистити нас, бідних, невинних користувачів, було обмінюватися кожним з’єднанням, щоб перевірити наявність загроз ще до того, як вони дійшли до нас. Як ви можете собі уявити, мене охопило відчуття безпеки.

Коротше кажучи, самопідписаний сертифікат потрібно встановити в npm, щоб уникнути SELF_SIGNED_CERT_IN_CHAIN:

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

В якості альтернативи для NODE_EXTRA_CA_CERTSзмінної середовища можна встановити файл сертифіката.

Я думаю, що це все, що я знаю про те, як змусити npm працювати за проксі / брандмауером. Нехай комусь це стане в нагоді.

Редагувати : Вимкнути HTTPS для цієї проблеми, використовуючи реєстр HTTP або налаштування, є справді поширеною пропозицією NODE_TLS_REJECT_UNAUTHORIZED. Це не найкращі ідеї, тому що ви відкриваєтесь для подальших атак "людина посередині" або перенаправлення. Швидке підроблення ваших записів DNS на машині, яка робить установку пакета, і ви виявите, що довіряєте пакетам з будь-якого місця. Змусити HTTPS працювати може здатися великою роботою, але настійно рекомендується. Коли ви відповідаєте за допуск ненадійного коду до компанії, ви зрозумієте, чому.

Редагування 2 : Майте на увазі, що настройка npm config set cafile <path>змушує npm використовувати лише ті сертифікати, що містяться в цьому файлі, замість того, щоб розширювати наявні за допомогою них.

Якщо ви хочете розширити існуючі сертифікати (наприклад, сертифікатом компанії), використовуючи змінну середовища NODE_EXTRA_CA_CERTSдля посилання на файл, це шлях, який може заощадити вам багато клопоту. Подивіться, як додати-спеціальний-сертифікат-орган-ca-to-nodejs


9
У Windows мені довелося скористатися косими рисками: конфігурація npm встановила cafile "C: /dev/Firefox/mycert.cer"
Джон Ісус

4
** Без знака рівності= npm config set cafile "<path to your certificate file>"
Моті Вінклер,

3
Це дивовижна відповідь - я не міг узагальнити власні головні болі, що стосуються проксі + zscalar
Jpnh

7
так сміявся через "Як ви можете собі уявити, мене охопило відчуття безпеки". :)
Mario B

3
Як отримати файл сертифіката?
Aditya

36

Ця проблема була виправлена ​​для мене за допомогою http-версії сховища:

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

52
Це дуже погане рішення!
KiT, 02

4
@HaBo Я здогадуюсь, він означає, що це небезпечно.
gabeio

3
@KiTO Це погане рішення, погодились. Але чому я повинен возитися з проблемами сертифікатів, коли я просто хочу встановити деякі пакети?
Ich

17
Ця відповідь правильна. Бувають деякі випадки, коли ви стоїте за безладдям корпоративного проксі з власною ланцюжком сертифікатів, а іншого немає (крім взагалі відключення сертифікатів), окрім цього (особливо коли вони не надають вам прав адміністратора). Це звучить як помилка npm, яка неправильно завантажує належні налаштування з системи. Але задля перехресної сумісності вони не виправлять npm, тож це результат цього. Люди, які кажуть, що це погана відповідь, вони не уявляють, про що говорять.
kenorb

3
@kenorb, що неправильно, ви можете відстежити кроки, які робить ваш проксі, і додати ці самопідписані сертифікати до вашого ланцюжка за допомогою cafile.
Дардо

15
npm config set strict-ssl false

вирішив питання для мене. У цьому випадку і мій агент, і депозитарій артефактів перебувають за приватною підмережею на хмарі aws


7

У мене така ж проблема, я подолав використання

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

Додатково інформація на node-doc


6

Я випадково зіткнувся з подібною проблемою SSL кілька днів тому. Проблема в тому, що npm не встановлює кореневий сертифікат для сертифіката, який використовується https://registry.npmjs.org .

Рішення:

  1. Використовуйте wget https://registry.npmjs.org/coffee-script --ca-certificate=./DigiCertHighAssuranceEVRootCA.crt для вирішення проблеми з Wget
  2. Використовуйте npm config set cafile /path/to/DigiCertHighAssuranceEVRootCA.crtдля встановлення кореневого сертифіката для вашої програми npm.

Ви можете завантажити кореневий сертифікат з: https://www.digicert.com/CACerts/DigiCertHighAssuranceEVRootCA.crt

Примітка: Інша програма може використовувати різний спосіб управління кореневим сертифікатом, тому не змішуйте браузер з іншими.

Аналіз:

давайте wget https://registry.npmjs.org/coffee-scriptспочатку вирішимо вашу проблему. ваш фрагмент каже:

        ПОМИЛКА: не вдається перевірити сертифікат registry.npmjs.org,
        видано / C = US / ST = CA / L = Oakland / O = npm / OU = npm 
       Орган, що засвідчує сертифікат / CN = npmCA/emailAddress=i@izs.me:
       Не вдається локально перевірити повноваження емітента.

Це означає, що ваша програма wget не може перевірити https://registry.npmjs.orgсертифікат. Є дві причини, які можуть спричинити цю проблему:

  1. Ваша програма wget не має кореневого сертифіката цього домену. Кореневий сертифікат зазвичай постачається з системою.
  2. Домен не упаковує кореневий сертифікат у свій сертифікат.

Таким чином, рішення явно встановлено кореневий сертифікат для https://registry.npmjs.org. Ми можемо використати openssl, щоб переконатися, що причиною нижче є проблема.

Спробуйте openssl s_client -host registry.npmjs.org -port 443командний рядок, і ми отримаємо це повідомлення (перші кілька рядків):

    ПІДКЛЮЧЕНО (00000003)
    глибина = 1 / C = США / O = DigiCert Inc / OU = www.digicert.com / CN = DigiCert High Assurance CA-3
    перевірити помилку: num = 20: не вдалося отримати сертифікат місцевого емітента
    підтвердити повернення: 0
    ---
    Ланцюжок сертифікатів
     0 с: / C = США / ST = Каліфорнія / L = Сан-Франциско / 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 с: / C = США / 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
    ---

Цей рядок verify error:num=20:unable to get local issuer certificateпереконує, що https://registry.npmjs.orgне упаковує кореневий сертифікат. Отже, ми DigiCert High Assurance EV Root CAкореневий сертифікат Google .


Якщо ви можете надати лише текстовий базовий файл (наприклад, для збірки Jenkins), цей сертифікат можна перетворити на pem: openssl x509 -inform DER -outform PEM -in DigiCertHighAssuranceEVRootCA.crt -out DigiCertHighAssuranceEVRootCA.pem
Audrius Meskauskas

4

У мене була та сама проблема. Після деякого копання я зрозумів, що багато сценаріїв після / передвстановлення намагаються встановити різні залежності, і іноді використовуються конкретні сховища. Кращий спосіб - відключити перевірку сертифіката для модуля https для nodejs, який працював у мене.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

З цього питання


2
Як уже зазначалося, це не вирішить проблему SSL, а лише пройде. Правильний спосіб вирішити це - правильно налаштувати кожен пакет (git, npm, node) для довіри належному сертифікату підписання. Якщо ви стоїте за корпоративним довіреною особою, курсу.
Aaron C

0

Проблема полягає у вашому проксі. Оскільки постачальник розташування вашого інсталяційного пакета створює власний сертифікат і не купує перевірений у прийнятого органу, ваш проксі-сервер не дозволяє доступ до цільового хоста. Я припускаю, що ви використовуєте проксі-сервер під час використання браузера Chrome. Тож перевірки немає.

Є кілька рішень цієї проблеми. Але все означає, що ви довіряєте постачальнику пакетів.

Можливі рішення:

  1. Як зазначалося в інших відповідях, ви можете зробити http:// доступ, який може обійти ваш проксі. Це трохи небезпечно, тому що людина посередині може вводити шкідливе програмне забезпечення у ваші завантаження.
  2. Пропонує wgetвикористовувати прапор --no-check-certificate. Це додасть директиву проксі до вашого запиту. Проксі-сервер, якщо він розуміє директиву, не перевіряє, чи сертифікат серверів перевірений владою, і передає запит. Можливо, існує конфігурація з npm, яка робить те саме, що прапор wget.
  3. Ви налаштовуєте свій проксі-сервер на прийняття CA npm. Я не знаю вашого проксі-сервера, тому не можу підказати вам.


0

Якщо ви маєте контроль над проксі-сервером або можете переконати своїх ІТ-адміністраторів, спробуйте явно виключити registry.npmjs.org з перевірки SSL. Це повинно уникнути необхідності користувачам проксі-сервера вимикати або строгий контроль ssl, або встановлювати новий кореневий ЦС.


-1

Це те, що ви можете зробити, щоб уникнути npm і використовувати пряжу у віконній машині.

yarn config set "strict-ssl" false
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.