エラーメッセージ
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 や package-lock.json の resolved の URL に残っている古いホスト名、または本番環境で流用されたステージング用のホストが該当します。
プロキシが別の名前の証明書で応答している
ときどき設定を誤ったフォワードプロキシやキャプティブポータルは独自の証明書を提示しますが、その証明書にはレジストリの名前が含まれていません。
レジストリの証明書に名前が欠けている
ときどきクライアントが使う名前の 1 つ(たとえば、エイリアスとして残している古いホスト名)を含めずに再発行された証明書が原因です。
修正方法
- 1.
npm のレジストリ設定を証明書と比較する
設定されているレジストリ(とプロキシ設定)、および証明書の SAN リストを出力してください。ロックファイルにも resolved の URL が含まれているため、そこでも同じホストを使わなければなりません。
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 の接続先を証明書の名前に合わせる
すべての階層の .npmrc でレジストリ設定を更新してください(ロックファイルに古いホストが含まれている場合は、ロックファイルも再生成してください)。
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