本文へスキップ
ecdsa.com
npm (Node.js)パッケージマネージャー

エラーメッセージ

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 アドレス、誤った環境が使われている場合によく起こります。

発生する理由

修正方法

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

    npm の接続先を証明書の名前に合わせる

    すべての階層の .npmrc でレジストリ設定を更新してください(ロックファイルに古いホストが含まれている場合は、ロックファイルも再生成してください)。

    bash
    # Use the host name the registry's certificate was issued for
    npm config set registry https://npm.example.com/
  3. 3.

    レジストリ管理者:使用中のすべての名前をカバーする

    互換性のために残しているエイリアスを含め、クライアントが使うすべてのホスト名を入れてレジストリの証明書を再発行してください。

    bash
    # Registry owners: include every name clients use
    sudo certbot certonly --nginx -d npm.example.com -d registry.example.com

関連するエラー

署名エラーデータベースをすべて見る