はじめに
本記事の目的
本記事は、npm(Node.jsのパッケージ管理ツール)を使う際に発生しやすいSSL証明書関連のエラーについて、原因と安全な対策をわかりやすく解説することを目的としています。特に企業ネットワークやプロキシ環境で自己署名証明書が使われる場面を想定し、具体的な手順と注意点を示します。
この章で得られること
- SSLエラーがなぜ起きるかの見通しが立ちます
- 安全な対応の方針が分かります
- 本記事全体の流れと各章の役割が把握できます
対象読者
- npmを日常的に使う開発者や運用担当者
- 企業ネットワークで開発環境を構築するエンジニア
- SSLや証明書の基本は知っているが、実務での対処法を知りたい方
本記事の構成(全7章)
- はじめに(本章)
- npmでよく発生するSSL関連エラーとは
- エラー発生時の一般的な原因
- 推奨される安全な対策方法
- 一時的な回避策(非推奨)
- その他の設定と環境変数
- まとめと注意点
次章からは、実際に出会いやすいエラーメッセージと現象の説明に移ります。この記事を読めば、問題の切り分けが速くなり、安全にnpmを使えるようになるはずです。
npmでよく発生するSSL関連エラーとは
概要
npmでパッケージを操作しているとき、SSL(https)の証明書に関するエラーが出ることがあります。代表的な表示例は次の通りです。
- “Unable to get local issuer certificate”
- “self signed certificate in certificate chain”
- “certificate has expired”
- “UNABLE_TO_GET_ISSUER_CERT_LOCALLY”
どういう状況で出るか
これらは主に、npmが接続先のサーバー証明書を信頼できないと判断したときに発生します。たとえば社内プロキシ経由で通信している、自己署名の証明書を使っている、または端末の時刻がずれている場合です。
よくある具体例
- 会社のネットワークでプロキシが中間で証明書を差し替えている
- 社内で発行した自己署名証明書を使っている
- 端末の日時が大きくずれていて証明書検証に失敗する
- npmのregistryやCA設定が誤っている
まず確認すること(簡単チェック)
- 日付と時刻が正しいか
- ネットワークが会社のプロキシ経由か
- 他のHTTPSサイトが正常に開けるか
- npmのregistry設定やssl関連の設定を確認する
次章では、これらのエラーが起きる具体的な原因を詳しく見ていきます。
エラー発生時の一般的な原因
この章では、npmでSSL関連のエラーが出たときに考えられる代表的な原因を、わかりやすく説明します。具体例や簡単な確認方法も添えます。
プロキシ設定の誤り
会社やネットワークでプロキシを使うと、npmがインターネットへ接続する際にプロキシ経由となります。プロキシ設定が間違っていると、証明書の検証に失敗しやすくなります。例: 設定が空だったり、HTTPとHTTPSで別の値が必要だったりします。まずは npm config get proxy
と npm config get https-proxy
で現在の設定を確認してください。プロキシ情報が合っているか、ネットワーク管理者に確認するのが安心です。
自己署名証明書の利用
社内環境で自己署名(社内CA)を使っている場合、npmはその証明書を信頼しません。結果として「証明書が信頼できない」といったエラーになります。対処は、社内のCA証明書をOSやNodeが参照する信頼ストアに追加する方法が安全です。短期的にはnpmの cafile
設定で社内CAを指定できますが、正しく運用するにはシステム管理者と相談してください。
npmの strict-ssl 設定
npmは strict-ssl
が true
のとき、不正な証明書を拒否します。これを false
にすると検証を飛ばせるため動作することがありますが、通信が暗号化されていても中間者攻撃などのリスクが高まります。一時的な確認用以外では false
にしないことを強くおすすめします。
推奨される安全な対策方法
npmで発生するSSL問題には、接続を安全に保ちながら解決する方法がいくつかあります。ここでは推奨される安全な対策を丁寧に説明します。
A. 自己署名証明書をnpmに認識させる(推奨)
- 証明書ファイル(例:your-cert.crt)を用意します。公開鍵を含むPEM形式が一般的です。
- npmに証明書を設定します。
npm config set cafile /path/to/your-cert.crt
この設定で、npmは指定した証明書を信頼して接続します。プロジェクト単位で指定したい場合は、プロジェクトの .npmrc に同じ設定を書くと便利です。証明書ファイルはアクセス権を適切に管理してください。
注意点:自己署名証明書は信頼できる発行元のものだけに限定してください。未知の証明書を追加すると安全性が損なわれます。
B. システムのトラストストアに証明書を追加する
- Linux(Debian/Ubuntuなど):証明書を /usr/local/share/ca-certificates/ にコピーし、
sudo cp your-cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates
- macOS:Keychain Accessで証明書をインポートし、「常に信頼」に設定します。
- Windows:Certificate Manager(certmgr.msc)を開き、「Trusted Root Certification Authorities」へインポートします。
システム信頼ストアに入れると、npmだけでなくcurlやブラウザなど他のツールでも同じ証明書が信頼されます。最後にnpmコマンドや端末を再起動して動作を確認してください。
補足:可能であれば、社内のルートCAや公式の認証局から発行された証明書を使うと、より安全で運用が楽になります。
一時的な回避策(非推奨)
以下は一時的に問題を回避する方法です。いずれもセキュリティを弱めるため、本番環境では絶対に使わないでください。開発やデバッグの短時間のみに限定してください。
A. strict-ssl を false にする
npm config set strict-ssl false
SSL 証明書の検証を無効化します。自己署名証明書やプロキシでの接続確認には使えますが、中間者攻撃に対して脆弱になります。利用後は必ず元に戻してください。
再有効化:
npm config set strict-ssl true
B. NODE_TLS_REJECT_UNAUTHORIZED を 0 に設定
UNIX/macOS:
export NODE_TLS_REJECT_UNAUTHORIZED=0
PowerShell:
$env:NODE_TLS_REJECT_UNAUTHORIZED = "0"
CMD:
set NODE_TLS_REJECT_UNAUTHORIZED=0
全ての TLS 検証がオフになります。短時間でのデバッグ用にとどめ、環境変数を設定したターミナルやプロセスだけに限定してください。終了時はターミナルを閉じるか、変数を削除してください。
削除(UNIX/macOS):
unset NODE_TLS_REJECT_UNAUTHORIZED
C. npm レジストリ URL を http に変更
npm config set registry http://registry.npmjs.org/
通信が暗号化されなくなります。認証情報やパッケージ内容が傍受される恐れがあります。変更後は必ず HTTPS に戻してください。
戻す:
npm config set registry https://registry.npmjs.org/
■ 推奨事項
– 一時措置にとどめ、恒久的対策(証明書の更新・正しい CA を指定・プロキシ設定の修正)を優先してください。
– 使った後は設定を元に戻し、影響範囲をログやチームに報告してください。
その他の設定と環境変数
この章では、npmやNode.jsで使う主な設定項目と環境変数を分かりやすく紹介します。設定は正しくするとSSL関係の問題を未然に防げます。
cafile
- 説明: 信頼する証明書(CA)をファイルで指定します。社内CAなどを使うときに有効です。
- 例: npm config set cafile “/path/to/ca.pem”
- 注意: ファイルはPEM形式で用意してください。
strict-ssl
- 説明: trueにするとnpmがSSL証明書を厳格に検証します。安全性が高まります。
- 例: npm config set strict-ssl true
- 推奨: 本番や公開レジストリでは常にtrueにしてください。
registry
- 説明: 利用するnpmレジストリのURLを指定します。社内のミラーを使うときに変更します。
- 例: npm config set registry “https://registry.npmjs.org/”
環境変数
- NODE_TLS_REJECT_UNAUTHORIZED
- 説明: Node.jsのSSL検証を制御します。0で検証を無効化、1で有効化です。
- 使い方: export NODE_TLS_REJECT_UNAUTHORIZED=0(デバッグのみ)
-
注意: 無効化はセキュリティリスクが高いため常用しないでください。
-
NODE_EXTRA_CA_CERTS
- 説明: Node.js全体に追加のCA証明書を読み込ませます。社内CAを使う際に便利です。
-
使い方: export NODE_EXTRA_CA_CERTS=”/path/to/ca.pem”
-
HTTPS_PROXY
- 説明: プロキシ経由で通信する場合に設定します。HTTP形式でホストとポートを指定します。
- 使い方: export HTTPS_PROXY=”http://proxy.example.com:8080″
それぞれ設定を変更したら、動作を確認してから本番環境に反映してください。安全性を損なう設定は一時的に使い、元に戻す習慣をつけると安心です。
まとめと注意点
npm利用時のSSL証明書エラーは、自己署名証明書やプロキシ、期限切れ・中間証明書の欠落が主な原因です。安全に運用するためのポイントを分かりやすくまとめます。
主要なまとめポイント
- SSL検証を無効化しないこと:一時回避は可能ですが、長期運用で無効化すると中間者攻撃のリスクが高まります。
- 証明書を正しく配置する:組織内CAや自己署名証明書を使う場合は、npmのcafileやNODE_EXTRA_CA_CERTSで明示的に指定します。
- 環境ごとに設定を分ける:開発環境ではローカル設定、CIや本番では厳格な検証を行います。
- プロキシ環境の確認:プロキシがSSLを差し替える場合、プロキシの証明書をクライアントに信頼させる必要があります。
- Nodeやnpmを最新に保つ:古いバージョンでは証明書チェーンやTLSの仕様に問題が出ることがあります。
運用上の注意点
- .npmrcや環境変数に秘密情報を置かないでください。誤って公開するとリスクが高まります。
- 一時回避策を使った場合は期限を決め、恒久対応(正しい証明書の導入)を優先して進めてください。
- トラブル対応時は、まずnpm ERRのログとopenssl s_clientなどで証明書チェーンを確認します。
安全第一で、設定は最小限の例外に留め、検証を怠らない運用を心がけてください。