Node.js で SSL 証明書エラー「Error: unable to verify the first certificate」の徹底解説

2024-04-15

Node.js アプリケーションで SSL 証明書を使用する場合、Error: unable to verify the first certificate というエラーが発生することがあります。このエラーは、クライアントがサーバーからの SSL 証明書を検証できないことを示します。

原因

このエラーにはいくつかの原因が考えられます。

  • 証明書が信頼できない
    • 証明書が有効期限切れになっている
    • 証明書が発行元によって信頼されていない
    • 証明書がサーバー名と一致しない
  • 証明書チェーンが不完全
    • 中間証明書が欠けている
  • Node.js 環境設定が間違っている
    • NODE_TLS_REJECT_UNAUTHORIZED 環境変数が設定されている
    • ca オプションが require('https').globalAgent に設定されていない

解決策

以下の方法で問題を解決できます。

証明書を確認する

  • 証明書がサーバー名と一致することを確認する。

証明書チェーンを完成させる

  • 中間証明書をインストールする。
  • コードの中で証明書を正しく読み込んでいることを確認する。

デバッグツールを使用する

  • Node.js のデバッグツールを使用して、問題の原因を特定する。

補足

この問題は、Jira などのサードパーティ製アプリケーションを使用している場合にも発生する可能性があります。その場合は、アプリケーションのドキュメントを参照するか、アプリケーションの開発者にサポートを依頼する必要があります。




サンプルコード:Node.js で HTTPS クライアントを作成し、SSL 証明書を検証する

const https = require('https');

const options = {
  hostname: 'example.com',
  port: 443,
  path: '/',
  ca: fs.readFileSync('ca-cert.pem'),
};

const req = https.request(options, (res) => {
  console.log(`statusCode: ${res.statusCode}`);

  res.on('data', (data) => {
    console.log(data.toString());
  });

  res.on('end', () => {
    console.log('end');
  });
});

req.on('error', (err) => {
  console.error(err);
});

req.end();

説明

  1. https モジュールをインポートします。
  2. options オブジェクトを作成します。このオブジェクトには、リクエスト先のホスト名、ポート番号、パス、および CA 証明書ファイルへのパスを設定します。
  3. https.request() メソッドを使用して、HTTPS リクエストを作成します。
  4. リクエストイベントリスナーを設定します。
    • statusCode イベントリスナーは、ステータスコードを出力します。
    • end イベントリスナーは、リクエストが完了したことを示します。
  5. エラーイベントリスナーを設定します。このリスナーは、エラーが発生した場合にエラーメッセージを出力します。
  6. req.end() メソッドを呼び出して、リクエストを開始します。

注意事項

  • このコードはあくまで例であり、実際の状況に合わせて変更する必要があります。
  • ca-cert.pem は、CA 証明書ファイルへの実際のパスに置き換える必要があります。
  • SSL 証明書が信頼できるものであることを確認してください。

上記以外にも、Node.js で HTTPS クライアントを作成し、SSL 証明書を検証する方法に関する情報は、以下のリソースを参照してください。




Node.js で SSL 証明書エラー「Error: unable to verify the first certificate」を解決するその他の方法

環境変数を使用する

以下の環境変数を設定することで、Node.js が使用する CA 証明書ファイルを変更できます。

  • NODE_EXTRA_CA_CERTS: 追加の CA 証明書ファイルへのパスを指定します。
  • NODE_TLS_REJECT_UNAUTHORIZED: この変数を 0 に設定すると、Node.js が無効な証明書を拒否しなくなります。(注意: セキュリティ上のリスクがあるため、この方法は推奨されません。)

NODE_EXTRA_CA_CERTS=/path/to/ca-cert.pem node my-script.js

カスタム CA ストアを使用する

以下のコードのように、カスタム CA ストアを作成して使用することができます。

const https = require('https');
const fs = require('fs');

const ca = fs.readFileSync('ca-cert.pem');
const agent = new https.Agent({ ca });

const req = https.request('https://example.com', { agent }, (res) => {
  // ...
});

// ...

サードパーティ製ライブラリを使用する

requestaxios などのサードパーティ製ライブラリを使用すると、HTTPS リクエストをより簡単に実行できます。これらのライブラリは、SSL 証明書検証などの機能を備えていることが多いため、エラーの解決に役立つ場合があります。

const request = require('request');

request('https://example.com', { ca: fs.readFileSync('ca-cert.pem') }, (error, response, body) => {
  if (error) {
    console.error(error);
  } else {
    console.log(body);
  }
});
  • 上記の方法は、Node.js のバージョンや使用しているライブラリによって異なる場合があります。

node.js ssl-certificate jira


[保存版] Node.js ユーザー認証: 実装方法からライブラリ選びまで

Node. jsは、近年人気が高まっているサーバーサイドJavaScriptランタイム環境です。Webアプリケーション開発において、ユーザー認証は必須の機能となります。適切なライブラリを用いることで、安全かつ効率的な認証システムを構築することができます。...


Node.jsでファイルを効率的に配信する:パフォーマンスとセキュリティを考慮したベストプラクティス

res. sendFile メソッドを使用するこれは、最も簡単で一般的な方法です。以下のコード例のように、res. sendFile メソッドに送信するファイルのパスを渡すだけです。このコードでは、/file エンドポイントに GET リクエストがくると、res...


Node.js: ディレクトリ削除の罠 - 空でないディレクトリを安全に削除する方法

fs. rmdirSync は、ディレクトリを削除する同期的な関数です。ディレクトリが空の場合のみ削除できます。ディレクトリが空でない場合は、エラーが発生します。fs. rmdir は、ディレクトリを削除する非同期的な関数です。ディレクトリが空でない場合、err コールバックにエラーが渡されます。...


【今すぐできる】Firebase Storage と Cloud Functions を組み合わせたファイル共有システムの構築

このチュートリアルでは、Cloud Functions for Firebase を使って、アップロードされたファイルのダウンロードURLを取得する方法を説明します。この方法は、ユーザーがアップロードしたファイルにアクセスするための安全な方法を提供します。...


SQL SQL SQL SQL Amazon で見る



【もう悩まない!】JavaScript/Node.js/SSLで発生する「Unable to verify leaf signature」エラーを完全解決!

「Unable to verify leaf signature」エラーは、一般的にSSL/TLS接続確立時に発生するエラーで、クライアントがサーバー証明書の署名検証に失敗した場合に表示されます。このエラーは、主に以下の3つの要素に関連するプログラミングの問題によって引き起こされます。