Error: self-signed certificate in certificate chain の解決方法

Error: self-signed certificate in certificate chain の解決方法

このエラーは、自己署名証明書を含むSSL/TLS証明書チェーンが信頼されない場合に発生します。Node.jsやnpm、HTTPSリクエストを使用する環境でよく見られる問題です。本記事では、エラーの原因と解決方法を詳しく説明します。

エラーの発生条件

  • 自己署名証明書が使用されている
  • 証明書チェーンが正しく構成されていない
  • 証明書がシステムやアプリケーションに信頼されていない
  • プロキシサーバーが自己署名証明書を使用している

原因1: 自己署名証明書の使用

自己署名証明書は信頼されていないため、セキュリティチェックでエラーが発生します。

解決方法1: 証明書を信頼リストに追加

システムまたはNode.jsで証明書を信頼する設定を行います。

// 証明書ファイルを読み込んで信頼リストに追加
const https = require('https');
const fs = require('fs');

const options = {
  ca: fs.readFileSync('path/to/certificate.crt'),
};

https.get('https://example.com', options, (res) => {
  console.log('Response status:', res.statusCode);
});

原因2: npmのHTTPSリクエスト

npmが自己署名証明書を含むHTTPSリクエストを行うとエラーが発生します。

解決方法2: npmのstrict-sslオプションを無効化

自己署名証明書の確認をスキップします。ただし、この方法は一時的な解決策として使用してください。

npm config set strict-ssl false

原因3: プロキシサーバーの影響

プロキシサーバーが自己署名証明書を使用している場合にエラーが発生します。

解決方法3: プロキシの設定を見直す

npmにプロキシ設定を追加します。

npm config set proxy http://proxy-server-address:port
npm config set https-proxy http://proxy-server-address:port

原因4: 証明書チェーンの不完全さ

中間証明書が欠落している場合、証明書チェーンが不完全になりエラーが発生します。

解決方法4: 中間証明書を追加

中間証明書を正しい順序で証明書ファイルに含めます。

// 証明書チェーンファイルを作成
cat server.crt intermediate.crt > fullchain.crt

原因5: 古いNode.jsバージョン

古いバージョンのNode.jsではTLS/SSLの処理が適切に行われない場合があります。

解決方法5: Node.jsをアップデート

最新バージョンのNode.jsをインストールします。

nvm install node

原因6: OpenSSLの設定

OpenSSLが正しく設定されていない場合、証明書エラーが発生します。

解決方法6: OpenSSLの設定を確認

OpenSSLのCA証明書パスを確認または設定します。

export SSL_CERT_FILE=/path/to/cacert.pem

原因7: グローバルなnpm設定

npmのグローバル設定に問題がある場合、エラーが発生します。

解決方法7: npm設定をリセット

npmの設定をリセットします。

npm config delete strict-ssl
npm config delete proxy
npm config delete https-proxy

原因8: サードパーティモジュールの影響

外部モジュールがSSL/TLSエラーを引き起こしている場合があります。

解決方法8: モジュールのアップデート

依存関係を最新バージョンにアップデートします。

npm update

原因9: 環境変数の不足

適切な環境変数が設定されていない場合にエラーが発生します。

解決方法9: NODE_TLS_REJECT_UNAUTHORIZEDの設定

一時的に自己署名証明書を許可します。この方法は推奨されません。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

原因10: 開発環境でのSSL検証

開発環境でSSL検証が必要ない場合にエラーが発生します。

解決方法10: 開発環境用の例外設定

開発環境でのみSSL検証をスキップします。

const axios = require('axios');

const instance = axios.create({
  httpsAgent: new https.Agent({
    rejectUnauthorized: false,
  }),
});

原因11: 信頼できるCAリストの不足

システムまたはNode.jsが使用するCAリストが更新されていない場合にエラーが発生します。

解決方法11: CAリストを更新

最新のCA証明書リストを取得します。

curl -o cacert.pem https://curl.se/ca/cacert.pem

まとめ

「Error: self-signed certificate in certificate chain」は、SSL/TLS証明書の信頼性が主な原因です。信頼リストの設定や証明書チェーンの構成を確認することで解決できます。