Сообщение об ошибке
npm error code CERT_HAS_EXPIRED
Также выводится как
- npm ERR! code CERT_HAS_EXPIRED
- npm error request to https://registry.example.com/lodash failed, reason: certificate has expired
npm 10 и новее выводят «npm error code CERT_HAS_EXPIRED», npm 9 и более ранние версии — «npm ERR! code CERT_HAS_EXPIRED». В следующих строках указан URL с «reason: certificate has expired».
npm (Node.js) — registry request over HTTPS
Что это означает
По часам этой машины срок действия одного из сертификатов в цепочке, которую npm получил от реестра (или от промежуточного прокси), уже истёк. Для публичного реестра это почти никогда не означает, что истёк сертификат самого npm: причина обычно в старом CA, закреплённом в конфигурации npm, в устаревшем списке корневых сертификатов Node.js, в сертификате прокси или в неправильно идущих часах. У частных реестров срок действия сертификата сервера действительно мог истечь.
Почему это происходит
Истёк срок действия сертификата частного реестра
частоСамостоятельно развёрнутые экземпляры Nexus, Artifactory или Verdaccio и корпоративные прокси, сертификаты которых продлевают вручную.
Очень старый Node.js с устаревшими корневыми сертификатами
иногдаNode.js хранит список корневых сертификатов внутри исполняемого файла; релизы, выпущенные до того, как CA сменил корневой сертификат, могут знать только истёкший корневой сертификат и поэтому завершаться ошибкой там, где текущие релизы проходят проверку.
Старый CA, закреплённый настройкой ca или cafile
иногдаЗапись ca= или cafile=, оставшаяся в .npmrc много лет назад, заменяет корневые сертификаты Node.js по умолчанию для запросов к реестру, поэтому npm продолжает проверять цепочку по этому старому сертификату, срок действия которого уже истёк.
Системные часы идут неправильно
иногдаПрежде чем менять конфигурацию, проверьте дату на виртуальных машинах, в контейнерах и на устройствах без часов с батарейным питанием.
Как исправить
- 1.
Выясните, о каком реестре и каком сертификате идёт речь
Посмотрите, какой реестр настроен и до какой даты действует сертификат, который он отдаёт. Сертификат частного реестра с истёкшим сроком действия необходимо продлить на сервере.
bash npm config get registry echo | openssl s_client -connect registry.example.com:443 -servername registry.example.com 2>/dev/null \ | openssl x509 -noout -subject -enddate - 2.
Удалите устаревшие настройки ca или cafile
npm config list показывает настройки со всех уровней .npmrc; удалите записи ca или cafile, которые указывают на старые сертификаты (или обновите файл, на который они ссылаются).
bash # An old CA pinned in .npmrc replaces the default roots: list and remove it npm config list | grep -E '^;? *(ca|cafile)' npm config delete ca npm config delete cafile - 3.
Обновите Node.js и npm
Поддерживаемый релиз Node.js содержит современный список корневых сертификатов; после этого обновите npm.
bash node -v && npm -v # Node.js bundles its root list; very old releases carry expired roots # upgrade Node.js to a maintained release (nvm, fnm, volta or your OS packages), then: npm install -g npm@latest