1. ホーム
  2. javascript

[解決済み] nodejs - 証明書チェーンで自己署名証明書をエラーにする

2022-03-05 04:07:35

質問

クライアントサイドのhttpsリクエストで問題に直面しています。

スニペットは次のようなものです。

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

var options = {
    hostname: 'someHostName.com',
    port: 443,
    path: '/path',
    method: 'GET',
    key: fs.readFileSync('key.key'),
    cert: fs.readFileSync('certificate.crt')
}

var requestGet = https.request(options, function(res){
    console.log('resObj', res);
}

Error: Self signed certificate in certificate chain.

Postmanを使用する場合は、クライアント証明書と鍵をインポートして問題なく使用することができます。何か解決策はないでしょうか?また、postmanがどのように証明書を処理し、動作するのか、教えていただきたいです。

解決方法を教えてください。

オプション1: 警告を表示しない(開発者に有効)

質問内容から推測すると、SSL通信に自己署名証明書を使用しているため、開発で行っているのではないかと思われます。

その場合は、nodeを実行している場所で、環境変数として追加してください。

export NODE_TLS_REJECT_UNAUTHORIZED='0'
node app.js

で直接ノードを実行するか

NODE_TLS_REJECT_UNAUTHORIZED='0' node app.js

これはNodeに信頼されていない証明書(信頼されていない=認証局で検証されていない)を許可するように指示します。

環境変数を設定したくない場合や、複数のアプリケーションでこの処理を行う必要がある場合は、npmが提供する strict-ssl に設定することで false

npm config set strict-ssl=false

オプション2:postmanのようにCA証明書を読み込む(TLSでのテストに便利です)

投稿者 @kDoyle さんのように、すでにCA証明書を持っている場合は、各リクエストで設定できます (@nic ferrier さんありがとうございます)。

 let opts = {
    method: 'GET',
    hostname: "localhost",
    port: listener.address().port,
    path: '/',
    ca: fs.readFileSync("cacert.pem")
  };

  https.request(opts, (response) => { }).end();

オプション3:信頼できるソースからの適切なSSL証明書を使用する(本番に有効)

letsencrypt.orgは無料で、簡単に設定でき、鍵の自動ローテーションが可能です。 https://letsencrypt.org/docs/