ошибка получения: «Ошибка: ошибка SSL: SELF_SIGNED_CERT_IN_CHAIN» при использовании npm

294

Я использую npm v1.0.104 / node 0.6.12 в Ubuntu - я получаю сообщение об ошибке, скопированной ниже, при попытке установить любые новые модули через npm (я ранее тестировал socket.io, используя http, но не https, хотя мне интересно, может ли это привели к проблеме с сертификатами npm / unsigned). Ошибка появляется, когда npm пытается разрешить URL-адрес https://registry.npmjs.org . В любом случае я могу игнорировать ошибку или, возможно, найти / добавить сертификат в доверенное хранилище, чтобы продолжить использовать npm.

Любое понимание того, что необходимо сделать для решения проблемы, будет оценено (я предпочел бы решить проблему путем конфигурации, а не переустанавливать, если это возможно).

Ошибка: «Ошибка: Ошибка SSL: SELF_SIGNED_CERT_IN_CHAIN»

Полное сообщение:

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
Али Хайдер
источник
1
Не удаляйте строгий SSL. Посмотрите на stackoverflow.com/a/16534065
nolim1t
15
С 27 февраля 2014 года npm больше не поддерживает свои подписанные сертификаты. Пожалуйста, смотрите сообщение в блоге npm или недавний ответ ниже для получения дополнительной информации.
Кевин Рейли
1
Если у вас возникли проблемы с этим на AWS Elastic Beanstalk, решение доступно здесь: stackoverflow.com/questions/22096459/…
Гийом Фландр,
1
nolim1t : это не устраняет причину проблемы, и Кевин : команды в сообщении блога являются неполными. См. Stackoverflow.com/a/22099006/106302 для команд, которые работали для меня.
Мы все Моника
1
@ali ПОЖАЛУЙСТА, измените «Принятый ответ» Эта проблема возникает из-за обновления npm, а не из-за SSL. Отключение SSL - ПЛОХО, особенно потому, что в настоящее время правильным ответом является обновление npm. Ответ Кевина Рейли должен быть принятым ответом. Спасибо.
Mikezx6r

Ответы:

393

Выполнение следующего помогло решить проблему:

npm config set strict-ssl false

Я не могу комментировать, вызовет ли это какие-либо другие проблемы в данный момент. Надеюсь, поможет.

Али Хайдер
источник
39
вместо этого запустите "npm config set ca null", игнорирование ошибок ssl - плохая идея
alex
6
@SnowInferno SSL также гарантирует, что вы разговариваете с реальным registry.npmjs.org. Кто-то может потенциально установить вредоносные пакеты.
adotout
58
Это грязно неправильно. Почему вы вообще беспокоитесь об использовании SSL, если каждый раз, когда он делает то, что от него требуется, вы выключаете его? «Каждый раз, когда игнорирование ошибки ведет к успеху, разработчики собираются сделать это».
Джечлин
20
Пожалуйста, не игнорируйте проблемы ssl, так как ошибка существует по очень веской причине. Кроме того, в результате небольшого поиска был получен следующий твит, который ссылается на официальное решение вашей проблемы (обновление npm): twitter.com/npmjs/status/439279809307242496
Томас Вервест
41
Моя проблема была вызвана прокси, который я нахожусь, «npm config set ca null» и «npm config set ca» »все равно выдавали мне ту же ошибку, но удаление SSL работало отлично. Иногда хорошая практика не так важна, как то, что на самом деле работает.
Кори Шульц
221

С 27 февраля 2014 года npm больше не поддерживает свои самозаверяющие сертификаты . Следующие параметры, рекомендованные npm, позволяют выполнить одно из следующих действий:

Обновите свою версию npm

npm install npm -g --ca=""

-- ИЛИ --

Сообщите вашей текущей версии npm использовать известных регистраторов

npm config set ca ""

Обновление: npm опубликовал дополнительную справку по SELF_SIGNED_CERT_IN_CHAIN ​​и npm с дополнительными решениями для разных сред



Вам может понадобиться или не потребоваться готовиться sudoк рекомендациям.


Другие варианты

Похоже, что у людей возникают проблемы с использованием рекомендаций npm, поэтому вот некоторые другие потенциальные решения.

Сам узел обновления
Получив эту ошибку, можно предположить, что у вас более старая версия узла, которая, естественно, поставляется с более старой версией npm. Одним из решений является обновление вашей версии Node. Это, вероятно, лучший вариант, так как он обновляет вас и исправляет существующие ошибки и уязвимости.

Процесс здесь зависит от того, как вы установили Node, вашу операционную систему и так далее.

Обновление npm.
Возможно, вы попали сюда, пытаясь installсоздать пакет, возможно, что он npm install npm -gпотерпит неудачу с той же ошибкой. Если это так, используйте updateвместо этого. Как предлагает Нисант Соджан:

npm update npm -g

Обновите альтернативу npm.
Одним из способов решения этой проблемы является использование известных регистраторов, установка и прекращение использования известных регистраторов. Как предложено jnylen:

npm config set ca ""
npm install npm -g
npm config delete ca
Кевин Рейли
источник
10
Самым простым решением, вероятно, является загрузка самой последней версии Nodejs, она включает новую версию npm, в которой эта проблема решена. Ни одна из вышеперечисленных команд не сработала для меня.
Стрилл
1
Я использую это решение, так как оно первое, которое не игнорирует ssl (либо установив проверку в false в конфигурации, либо используя http). Спасибо!
hcpl
12
npm install npm -g также выдает ошибку SELF_SIGNED_CERT_IN_CHAIN
Андерс Борнхольм
3
Если это не работает, npm config set ca ""сначала выполните обновление, затем отмените изменение конфигурации. Смотрите: stackoverflow.com/a/22099006/106302
Мы все Моника
1
@Redsandro sudoменяет пользователя, -gустанавливает флажки , если установить глобально для этого пользователя или только локально node_modules.
Радек
68

Пока я просто переключил URL реестра с https на http. Как это:

npm config set registry="http://registry.npmjs.org/"
Герман
источник
1
Работал как шарм для меня. Я не хотел терять исходный CA или заставлять его игнорировать ошибки SSL.
SnowInferno
Работал отлично. Спасибо!
Мухаммед Василий
13
Отключение безопасности не может быть решением!
Алессандро Пеццато
1
Я ранее использовал это, но по какой-то причине переключение обратно на «https: //» с «http: //» заставило мою работу снова.
кшреве
Попробовав все другие решения, эта работа для меня наконец-то :-)
Swapnil Kadu
49
npm config set strict-ssl false -g

Чтобы сохранить это глобально

Робин
источник
Это дает мне печально известную cb() never called!ошибку npm
Джереми,
После этой настройки я получаю ошибку ниже npm ERR! код E401 нпм ERR! Невозможно подтвердить подлинность, необходимо: согласовать, NTLM npm ERR! Полный журнал этого прогона можно найти в: npm ERR! C: \ BuildAgent \ npm-cache_logs \ 2019-06-24T10_23_46_563Z-debug.log
Шами Куреши,
31

Вам необходимо обновить 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

Вам может понадобиться добавить префикс к этим командам sudo.

Источник: http://blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more

Мы все Моника
источник
@ Оливер Зальцбург: ре. Ваше редактирование: на OS X я не думаю, что sudoтребуется вообще, и только префикс команды обновления sudoсработал хорошо для меня. YMMV.
Мы все Моника
Ах, это сработало для меня. Спасибо за конкретные инструкции по отмене изменения конфигурации (так что мне не пришлось самому копать)!
Мэтт
Интересный. Я сделал редактирование только после того, как проверил это на сервере Debian. Мне нравится текущая версия, хотя;)
Der Hochstapler
Ubuntu / Debian требуют дополнительной ссылки, смотрите мой ответ ниже.
Redsandro
2
Это должно быть принятым решением. Это не отключает безопасность и является «официальным» решением, описанным в блоге npm.
Алессандро Пеццато
21

Ошибка SELF_SIGNED_CERT_IN_CHAINозначает, что у вас есть самозаверяющий сертификат в цепочке сертификатов, который в основном не является доверенным для системы.

Если это происходит, в основном происходит что-то подозрительное, поэтому, как уже прокомментировали люди, не рекомендуется просто отключать проверки сертификатов, но лучше понять, в чем заключается проблема, и устранить причину.

Это может быть связано либо с:

  • пользовательский адрес репозитория, который не имеет правильного сертификата,

  • корпоративная сеть с прозрачным прокси.

    Если вы работаете за корпоративным веб-прокси, вы должны установить правильные переменные HTTP_PROXY/ HTTPS_PROXYпеременные среды или установить их с помощью npm:

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

    Смотрите: Как настроить Node.js и Npm за корпоративным веб-прокси

Если вы доверяете хосту, вы можете экспортировать самоподписанный сертификат из цепочки и импортировать его в систему, чтобы они были помечены как доверенные.

Этого можно достичь, проверив сертификаты с помощью (перейдите example.comв репозиторий npm, который не работает на основании npm-debug.log):

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

затем сохраните содержимое сертификата (между BEGINи END) в .crtфайл, чтобы импортировать его.

Linux

Согласно предложению , вы можете добавить экспортированный сертификат в /etc/environmentфайл (Узел 7.4+), например:

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

CentOS

На CentOS 5 это можно добавить в /etc/pki/tls/certs/ca-bundle.crtфайл, например

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

Примечание. Чтобы экспортировать только первый сертификат, удалите его gв начале.

В CentOS 6 файл сертификата можно скопировать в /etc/pki/ca-trust/source/anchors/.

Ubuntu / Debian

В Ubuntu / Debian скопируйте файл CRT в и /usr/local/share/ca-certificates/ запустите:

sudo update-ca-certificates

Macos

В macOS вы можете запустить:

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

Windows

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


Смотрите также: npm - Устранение неполадок - Ошибка SSL

kenorb
источник
1
> В этом случае вам необходимо экспортировать самоподписанный сертификат из цепочки и импортировать его в систему, чтобы они были помечены как доверенные. - Делает трюк для меня.
dmi3y
2
Большой! Это также помогает добавить NODE_EXTRA_CA_CERTS = / etc / pki / ca-trust / source / anchors / yourCerts.pem в среду / etc /. Узел 7.4+ учитывает это
ph4r05
10

Помещение этого до команды, кажется, работает NODE_TLS_REJECT_UNAUTHORIZED=0. например:NODE_TLS_REJECT_UNAUTHORIZED=0 npm ...

Было бы лучше выяснить, как заставить узел видеть самозаверяющий сертификат действительным. строгое предложение выше не работает для меня по некоторым причинам. Если вы понимаете последствия для безопасности и нуждаетесь во временном быстром исправлении, это то, что я обнаружил в некоторых случайных проблемах github во время поиска ошибки в Google.

Адам Лейн
источник
1
для Windows используйте «set NODE_TLS_REJECT_UNAUTHORIZED = 0». И тогда работает как шарм!
Тарун
8

Хранилище больше не поддерживает самозаверяющие сертификаты. Вам нужно обновить 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

Вам необходимо открыть новый сеанс терминала, чтобы использовать обновленный npm.

Источник: изначально это была редакция ответа jnylen . Хотя в руководящих указаниях говорится: «Мы приветствуем все конструктивные изменения, но, пожалуйста, сделайте их существенными», редактирование было отклонено из-за «Это изменение слишком сильно меняет исходное сообщение; первоначальное значение или намерение сообщения будут потеряны». Я предполагаю, что сообщество предпочитает отдельный ответ.

Redsandro
источник
Это сработало для меня. Однако мне не нужен последняя команда: sudo ln -s /usr/bin/nodejs /usr/bin/node.
воздержание
1
Вероятно, это зависит от того, установили ли вы из официальных репозиториев Ubuntu, стороннего репозитория (для более новой версии) или скомпилировали сами (для самой новой версии).
Редсандро
7

Для тех, кто на mac с той же проблемой и установил npm через homebrew :

brew uninstall npm

затем

brew install npm

У меня работает на osx (10.9.1)

РЕДАКТИРОВАТЬ : Вам может понадобиться brew updateперед установкой npm. Вы также можете сделать brew upgradeпосле обновления доморощенного. Также может быть полезно запустить, brew doctorесли вы столкнетесь с любыми другими проблемами.

Патрик
источник
4

Быстрое и чистое решение (протестировано под Linux) (после усталости 27 февраля 2014 г.)


Удалить npm

npm rm npm -g

Установите npm (новый URL-адрес www.npmjs.org вместо npmjs.org )

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

Совет : как установить node.js в Linux https://stackoverflow.com/a/22099363/333061

Игорь Парра
источник
Команда больше не работает из-за перенаправления 301, но вы все равно можете набрать https://www.npmjs.org/install.shв браузере и загрузить его, прежде чем запускать вручную.
svassr
Или запустите curl с флагом -L
Эван Корделл
предыдущая curl https://npmjs.org/install.shкоманда перенаправляет https://www.npmjs.org/install.sh, поэтому curl https://www.npmjs.org/install.sh | shработает без проблем. теперь можно устанавливать маленький падаван. :)
Игорь Парра
2

Удалите NPM и установите его снова.

С 27 февраля 2014 года npm больше не поддерживает свои подписанные сертификаты. http://blog.npmjs.org/post/78085451721/npms-self-signed-certificate-is-no-more

Ссылка выше предлагает обновить NPM с помощью NPM. Это также не удается с SELF_SIGNED_CERT_IN_CHAIN ​​...

Флориан Зима
источник
2

Отключение SSL кажется очень плохой идеей. Блог npm объясняет, что они больше не поддерживают свой самоподписанный сертификат. Они предлагают обновить npm через npm install npm -g, но я, конечно, получил ту же ошибку SELF_SIGNED_CERT_IN_CHAIN. Поэтому я только что обновил узел, который обновил npm вместе с ним. Точная процедура зависит от того, как вы установили узел в первую очередь.

Иеремия Орр
источник