Node.js で SSL 証明書エラー「Error: unable to verify the first certificate」の徹底解説
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();
説明
https
モジュールをインポートします。options
オブジェクトを作成します。このオブジェクトには、リクエスト先のホスト名、ポート番号、パス、および CA 証明書ファイルへのパスを設定します。https.request()
メソッドを使用して、HTTPS リクエストを作成します。- リクエストイベントリスナーを設定します。
statusCode
イベントリスナーは、ステータスコードを出力します。end
イベントリスナーは、リクエストが完了したことを示します。
- エラーイベントリスナーを設定します。このリスナーは、エラーが発生した場合にエラーメッセージを出力します。
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) => {
// ...
});
// ...
サードパーティ製ライブラリを使用する
request
や axios
などのサードパーティ製ライブラリを使用すると、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