npmのSSLエラーを解決するには?原因と安全な対処方法をわかりやすく解説

目次

はじめに

「npm installを実行したらSSLエラーが表示されて、パッケージをインストールできない」
「証明書の設定を変更すれば直ると聞いたけれど、安全性に問題はないの?」と困っていませんか。

いつも通りnpmコマンドを実行しただけなのに、「CERT_HAS_EXPIRED」や「SELF_SIGNED_CERT_IN_CHAIN」などのエラーで処理が止まると、どの設定を確認すればよいのか迷ってしまいますよね。

この記事では、npmでSSLエラーが起きる原因の確認方法から、安全性を保ちながら解決する手順まで順を追って説明していきます。

Hnpmで発生するSSLエラーとは?

npmでSSLエラーが発生すると、パッケージのインストールや更新時にnpmレジストリとのHTTPS通信が成立せず、処理が途中で停止します。

ここでは、代表的な2つのSSLエラーの意味と、エラー発生時に最初に確認する項目を順に説明します。

「self signed certificate in certificate chain」が表示される場合

「self signed certificate in certificate chain」は、npmが受け取った証明書チェーンに自己署名証明書が含まれ、信頼できないと判断した場合に表示されます。

社内プロキシを利用している環境では、プロキシが発行した証明書をNode.jsやnpmが信頼できず、接続が止まることがあります。

エラーが出た場合は、npmで使用するCA証明書に、社内で指定された証明書が設定されているか確認しましょう。

「unable to get local issuer certificate」が表示される場合

「unable to get local issuer certificate」は、npmがSSL証明書を検証するときに、発行元となるCA証明書までたどれない場合に表示されます。

必要な中間CA証明書やルートCA証明書を確認できないと、接続先を信頼できずHTTPS通信が止まります。

エラーが出た場合は、使用しているCA証明書と証明書チェーンの設定を確認しましょう。

SSLエラーが発生したときに最初に確認すること

SSLエラーが発生したら、まずターミナルのエラーメッセージを確認し、「self signed certificate in certificate chain」などのエラー名を特定します。

そのうえで、社内プロキシの利用状況やnpmのCA証明書、Node.js・npmの設定を順番に確認すると、どこで証明書の検証に失敗しているのか切り分けやすくなります。

npmでSSLエラーが発生する主な原因

npmでSSLエラーが発生する場合は、HTTPS通信で使用する証明書をnpmやNode.jsが正しく検証できていない可能性があります。

ここでは、自己署名証明書、プロキシ、CA証明書、registryの4つに分けて主な原因を確認します。

自己署名証明書や社内CAを使用している

社内ネットワークで自己署名証明書や独自のCA証明書を使用していると、Node.jsが証明書を信頼できず、SSLエラーが発生することがあります。

特にHTTPS通信を社内設備が中継する環境では、npmレジストリとの通信に社内CAの証明書が使われる場合があります。

Node.jsがそのCA証明書を認識できるように設定されているか確認しましょう。

プロキシの設定に問題がある

npmに設定されたプロキシのURLやポート番号が現在の社内ネットワークと異なると、npmレジストリへの接続に失敗することがあります。

「npm config get proxy」と「npm config get https-proxy」を実行し、表示されたURLやポート番号が現在の設定と一致しているか確認しましょう。

npmのCA証明書設定に問題がある

npmの「ca」や「cafile」に古いCA証明書や存在しないファイルが指定されていると、SSL証明書を正しく検証できません。

「npm config get ca」と「npm config get cafile」を実行し、指定された証明書やファイルのパスが現在の環境に合っているか確認しましょう。

registryの設定に問題がある

npmの「registry」に誤ったURLが設定されていると、パッケージ取得時のHTTPS通信でエラーが発生することがあります。

「npm config get registry」を実行し、通常のnpmレジストリを利用している場合は「https://registry.npmjs.org/」が設定されているか確認しましょう。

社内レジストリの場合は、設定したURLと証明書の対象ホスト名が一致しているか確認します。

npmのSSLエラーを安全に解決する方法

npmのSSLエラーを解決するときは、証明書の検証そのものを無効にするのではなく、利用しているCA証明書や通信経路の設定を正しく指定します。

ここでは、SSL検証を無効化せずに対処するための4つの設定方法を順に説明します。

cafileでCA証明書を指定する

社内CAなどの証明書をnpmで信頼させる場合は、「cafile」にPEM形式のCA証明書ファイルを指定します。

「npm config set cafile “証明書ファイルのパス”」を実行したあと、「npm config get cafile」で正しいパスが表示されるか確認しましょう。

NODE_EXTRA_CA_CERTSでCA証明書を追加する

Node.js全体で社内CAなどを利用する場合は、環境変数「NODE_EXTRA_CA_CERTS」にPEM形式のCA証明書ファイルを指定します。

Windowsでは「set NODE_EXTRA_CA_CERTS=C:\path\to\ca.pem」、macOSやLinuxでは「export NODE_EXTRA_CA_CERTS=/path/to/ca.pem」のように設定すると、Node.jsの標準CAに追加して利用できます。

NODE_EXTRA_CA_CERTSを設定してもSSLエラーが続く場合は、Node.js側で証明書エラーが起きる原因も確認してみてください。
▶Node.jsでSSL証明書エラーが発生する原因と対処法

proxy・https-proxyの設定を確認する

プロキシ経由で接続している場合は、「npm config get proxy」と「npm config get https-proxy」を実行し、現在の設定を確認します。

表示されたホスト名やポート番号が社内で指定された値と異なる場合は、「npm config set proxy “プロキシURL”」または「npm config set https-proxy “プロキシURL”」で正しい値に変更しましょう。

社内ネットワークでプロキシを利用している場合は、プロキシの仕組みや設定方法をあわせて確認しておくと、接続できない原因を切り分けやすくなります。
▶プロキシサーバーとは?仕組みや設定方法をわかりやすく解説

registryの設定を確認する

「npm config get registry」を実行し、npmが接続するレジストリのURLを確認します。

通常のnpmレジストリを利用する場合は「https://registry.npmjs.org/」になっているか確認し、異なる場合は利用環境を確認したうえで「npm config set registry https://registry.npmjs.org/」に変更しましょう。

npmのSSLエラーで避けたい対処方法

npmのSSLエラーを一時的に回避するために、証明書の検証を無効化したり、HTTPSではなくHTTPで通信したりする設定は避ける必要があります。

ここでは、SSLエラーが発生しても常用しないほうがよい3つの対処方法を順に説明します。

strict-ssl=falseで証明書検証を無効にしない

「npm config set strict-ssl false」を設定するとSSLエラーを回避できる場合がありますが、npmによる証明書の検証が無効になります。

接続先が正しいか確認できなくなるため常用せず、CA証明書やプロキシの設定を見直して、証明書を正しく検証できる状態にしましょう。

NODE_TLS_REJECT_UNAUTHORIZED=0を常用しない

「NODE_TLS_REJECT_UNAUTHORIZED=0」を設定すると、Node.jsのTLS通信で証明書の検証が無効になります。

npm以外のNode.jsプロセスにも影響する可能性があるため常用せず、設定済みの場合は環境変数から削除し、必要なCA証明書を正しく指定しましょう。

registryをhttpに変更しない

SSLエラーを避けるために、npmの「registry」を「https://」から「http://」へ変更するのは避けましょう。

HTTPでは通信がTLSで保護されず、証明書による接続先の確認もできません。

通常のnpmレジストリを利用する場合は、「npm config get registry」で「https://registry.npmjs.org/」になっているか確認します。

npmでSSL証明書を確認する方法

npmでSSLエラーの原因を調べるときは、接続先で使用されているSSL証明書の発行元や有効期限、証明書チェーンを確認します。

ここでは、ssl-checkerの導入からCLI、Node.jsのコードを使った確認方法まで順に説明します。

ssl-checkerをインストールする

ssl-checkerを利用する場合は、「npm install ssl-checker」を実行してパッケージをインストールします。

プロジェクト単位で使う場合は、対象のディレクトリへ移動してから実行しましょう。

インストール後は、Node.jsのコードからSSL証明書の情報を取得できます。

CLIでSSL証明書を確認する

CLIから確認する場合は、「openssl s_client -connect 接続先:443 -servername 接続先」を実行します。

表示された内容から、証明書の発行元や検証結果、証明書チェーンを確認できます。

有効期限を確認したい場合は「openssl x509 -noout -dates」を使い、「notBefore」と「notAfter」を確認しましょう。

Node.jsのコードからSSL証明書を確認する

Node.jsではssl-checkerを読み込み、確認したいホスト名を指定すると、証明書の有効期限や残り日数などを取得できます。

npmレジストリを確認する場合は「registry.npmjs.org」を指定し、Node.jsを実行して取得結果を確認しましょう。

npmのSSLエラーが解決しない場合に確認すること

CA証明書やプロキシ、registryを設定してもnpmのSSLエラーが続く場合は、設定値と実際の通信環境が一致しているかをもう一度確認します。

あわせて、接続先のSSL証明書に有効期限切れや証明書チェーンの不足がないかを順に確認します。

npmの設定値とCA証明書の指定を再確認する

SSLエラーが続く場合は、「npm config list」で現在の設定値を確認します。

特に「cafile」や「ca」を設定している場合は、指定したパスに証明書ファイルが存在するか確認しましょう。

「npm config get cafile」でも指定先を確認し、使用するCA証明書と一致しているか照合します。

社内プロキシやセキュリティ環境を管理者に確認する

社内ネットワークで解決しない場合は、HTTPS通信がプロキシやSSL検査を経由しているか管理者に確認しましょう。

あわせて、npmで使用するプロキシのホスト名・ポート番号や、必要な社内CA証明書を確認し、「npm config get proxy」「npm config get https-proxy」の設定と照合します。

SSL証明書の有効期限や証明書チェーンを確認する

接続先の証明書について、有効期限が切れていないか、必要な中間CA証明書が含まれているか確認します。

「openssl s_client -connect 接続先:443 -servername 接続先 -showcerts」を実行すると、証明書チェーンや検証結果を確認できます。

有効期限は「notAfter」を確認し、期限が切れていないか確かめましょう。

証明書チェーンの見方が分からない場合は、ルート証明書や中間証明書の役割から確認すると理解しやすくなります。
▶SSL証明書の証明書チェーンとは?ルート証明書・中間証明書の仕組みを解説

まとめ

npmのSSLエラーが表示されたときは、まずエラーメッセージを確認し、CA証明書やプロキシ、registryなどの設定を順番に見直していきましょう。

社内CAを利用している場合は、「cafile」や「NODE_EXTRA_CA_CERTS」で必要な証明書を追加すると、HTTPS通信を保ったままエラーを解消できる場合があります。

「strict-ssl=false」などで証明書の検証を無効にする方法は常用せず、原因となっている設定を確認して修正することが大切です。

それでも解決しない場合は、証明書の有効期限や証明書チェーンも確認しながら、どこで検証に失敗しているのか一つずつ切り分けてみてください。

よかったらシェアしてね!
  • URLをコピーしました!

この記事を書いた人

目次