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

このエラーは、自己署名証明書を含むSSL/TLS証明書チェーンが信頼されない場合に発生します。Node.jsやnpm、HTTPSリクエストを使用する環境でよく見られる問題です。本記事では、エラーの原因と解決方法を詳しく説明します。
- 1. エラーの発生条件
- 2. 原因1: 自己署名証明書の使用
- 3. 解決方法1: 証明書を信頼リストに追加
- 4. 原因2: npmのHTTPSリクエスト
- 5. 解決方法2: npmのstrict-sslオプションを無効化
- 6. 原因3: プロキシサーバーの影響
- 7. 解決方法3: プロキシの設定を見直す
- 8. 原因4: 証明書チェーンの不完全さ
- 9. 解決方法4: 中間証明書を追加
- 10. 原因5: 古いNode.jsバージョン
- 11. 解決方法5: Node.jsをアップデート
- 12. 原因6: OpenSSLの設定
- 13. 解決方法6: OpenSSLの設定を確認
- 14. 原因7: グローバルなnpm設定
- 15. 解決方法7: npm設定をリセット
- 16. 原因8: サードパーティモジュールの影響
- 17. 解決方法8: モジュールのアップデート
- 18. 原因9: 環境変数の不足
- 19. 解決方法9: NODE_TLS_REJECT_UNAUTHORIZEDの設定
- 20. 原因10: 開発環境でのSSL検証
- 21. 解決方法10: 開発環境用の例外設定
- 22. 原因11: 信頼できるCAリストの不足
- 23. 解決方法11: CAリストを更新
- 24. まとめ
エラーの発生条件
- 自己署名証明書が使用されている
- 証明書チェーンが正しく構成されていない
- 証明書がシステムやアプリケーションに信頼されていない
- プロキシサーバーが自己署名証明書を使用している
原因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証明書の信頼性が主な原因です。信頼リストの設定や証明書チェーンの構成を確認することで解決できます。
-
前の記事
Reactでのマルチステップフォームの実装方法 2025.04.23
-
次の記事
MySQLのエラー『エラー1045: Access Denied』の解決方法 2025.04.23
コメントを書く