Сообщение об ошибке
npm error code ERR_TLS_CERT_ALTNAME_INVALID
Также выводится как
- npm ERR! code ERR_TLS_CERT_ALTNAME_INVALID
- npm error request to https://registry.example.com/lodash failed, reason: Hostname/IP does not match certificate's altnames: Host: registry.example.com. is not in the cert's altnames: DNS:www.example.com
npm 10 и новее выводят «npm error code ERR_TLS_CERT_ALTNAME_INVALID», npm 9 и более ранние версии — «npm ERR! code ERR_TLS_CERT_ALTNAME_INVALID». Хост и altnames в строке причины берутся из вашей конфигурации и сертификата сервера.
npm (Node.js) — registry request over HTTPS
Что это означает
Сертификат реестра считается доверенным, но выпущен не для того имени хоста, которое npm взял из URL реестра. В строке причины указаны обе стороны: хост, к которому обращался npm, и имена, которые содержит сертификат. Обычно так бывает после переезда реестра на новое имя или когда в URL реестра указан псевдоним, IP-адрес или не то окружение.
Почему это происходит
В URL реестра указано имя, на которое сертификат не распространяется
частоПсевдоним, IP-адрес, старое имя хоста, оставшееся в .npmrc или в URL из полей resolved в package-lock.json, либо staging-хост, повторно использованный в рабочей среде.
Прокси отвечает сертификатом для другого имени
иногдаНеверно настроенные прямые прокси и captive-порталы предъявляют собственный сертификат, в котором нет имени реестра.
В сертификате реестра не хватает имени
иногдаСертификат перевыпустили без одного из имён, по которым обращаются клиенты, например без старого имени хоста, оставленного как псевдоним.
Как исправить
- 1.
Сравните настройку реестра (registry) в npm с сертификатом
Выведите настроенный реестр (и настройки прокси) и список SAN сертификата. В lock-файлах тоже есть URL в полях resolved; в них должен быть тот же хост.
bash npm config get registry npm config list | grep -iE 'registry|proxy' echo | openssl s_client -connect registry.example.com:443 -servername registry.example.com 2>/dev/null \ | openssl x509 -noout -ext subjectAltName - 2.
Направьте npm на имя из сертификата
Обновите настройку реестра (registry) на всех уровнях .npmrc (и пересоздайте lock-файлы, если в них остался старый хост).
bash # Use the host name the registry's certificate was issued for npm config set registry https://npm.example.com/ - 3.
Владельцам реестров: включите в сертификат все используемые имена
Перевыпустите сертификат реестра со всеми именами хостов, по которым обращаются клиенты, включая псевдонимы, оставленные для совместимости.
bash # Registry owners: include every name clients use sudo certbot certonly --nginx -d npm.example.com -d registry.example.com