Подтвердить что ты не робот

Как исправить ошибку сертификата SSL при запуске Npm в Windows?

Когда я пытаюсь установить пакет с 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 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 authority.
To connect to registry.npmjs.org insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

Как я могу это исправить? Без ущерба для безопасности.


Я также использовал ошибки SSL-сертификата в своем веб-браузере, пока я не установил сертификат "npmCA" в качестве "доверенного корневого центра сертификации" в "Свойствах панели управления" (снимок экрана enter image description here)


Изменить: я пробовал небезопасное обходное решение для 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
4b9b3361

Ответ 1

TL; DR - просто запустите это и не отключайте вашу безопасность:

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

#Check the 'cafile'
npm config get cafile

Полный рассказ

Мне приходилось работать с npm, pip, maven и т.д. За корпоративным брандмауэром под Windows - это не весело. Я постараюсь держать эту платформу независимой/осведомленной, где это возможно.

HTTP_PROXY & HTTPS_PROXY

HTTP_PROXY & HTTPS_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:[email protected]:3128

Страшный НТЛМ

Существует код состояния 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 среды NODE_EXTRA_CA_CERTS может быть установлена в файл сертификата.

Я думаю, что все, что я знаю о том, как заставить npm работать за прокси/брандмауэром. Пусть кто-нибудь найдет это полезным.

Изменить: Это действительно распространенное предложение отключить HTTPS для этой проблемы либо с помощью реестра HTTP или настройки NODE_TLS_REJECT_UNAUTHORIZED. Это не очень хорошие идеи, потому что вы открываете себя для дальнейших атак "человек посередине" или перенаправления. Быстрая подмена ваших DNS-записей на компьютере, выполняющем установку пакетов, и вы обнаружите, что доверяете пакетам из любой точки мира. Может показаться, что заставить HTTPS работать много, но это настоятельно рекомендуется. Когда вы отвечаете за то, что пропускаете ненадежный код в компанию, вы поймете, почему.

Ответ 2

Эта проблема была исправлена ​​для меня, используя http-версию репозитория:

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

Ответ 3

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

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

Дополнительная информация на node -doc

Ответ 4

Я столкнулся с подобной проблемой 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. ваш фрагмент говорит:

        ERROR: cannot verify registry.npmjs.org 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 authority.

Это означает, что ваша программа wget не может проверить сертификат https://registry.npmjs.org. Есть две причины, которые могут вызвать эту проблему:

  1. Ваша программа wget не имеет этого корневого сертификата домена. Корневой сертификат обычно поставляется с системой.
  2. Домен не упаковывает корневой сертификат в свой сертификат.

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

Попробуйте openssl s_client -host registry.npmjs.org -port 443 в командной строке, и мы получим это сообщение (первые несколько строк):

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

Эта строка verify error:num=20:unable to get local issuer certificate, чтобы убедиться, что https://registry.npmjs.org не упаковывает корневой сертификат. Итак, мы DigiCert High Assurance EV Root CA корневой сертификат DigiCert High Assurance EV Root CA Google DigiCert High Assurance EV Root CA.

Ответ 5

У меня была такая же проблема. После некоторого рытья я понял, что многие сценарии post/pre-install будут пытаться установить различные зависимости, а иногда используются определенные репозитории. Лучше всего отключить проверку сертификата для модуля https для nodejs, который работал у меня.

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"

Из этого вопроса

Ответ 6

Конфигурация npm, установленная строгого-ssl false, решила проблему для меня. В этом случае мой агент и хранилище артефактов находятся за частной подсетью в облаке aws.

Ответ 7

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

Есть некоторые решения этой проблемы. Но все подразумевают, что вы доверяете поставщику пакетов.

Возможные решения:

  • Как упоминалось в других ответах, вы можете сделать доступ к http://, который может обойти ваш прокси. Это немного опасно, потому что человек в середине может вводить вредоносное ПО в ваши загрузки.
  • wget предлагает вам использовать флаг --no-check-certificate. Это добавит прокси-директиву к вашему запросу. Прокси-сервер, если он понимает эту директиву, не проверяет, проверен ли сертификат сервера полномочным органом и передает запрос. Возможно, есть конфиг с npm, который делает то же самое, что и флаг wget.
  • Вы настраиваете свой прокси для принятия CA npm. Я не знаю вашего прокси, поэтому я не могу дать вам намек.