web-dev-qa-db-ja.com

Node.jsリクエストCERT_HAS_EXPIRED

Mikealのリクエスト( https://github.com/mikeal/request )を使用して、サーバーへのhttpsリクエストを作成しています。ただし、CERT_HAS_EXPIREDの認証エラーが引き続き発生します。

request({
        url: 'https://www.domain.com/api/endpoint',
        strictSSL: false
    }, function(error, response, body) {
        if(!error && response.statusCode == 200) {
            res.json(JSON.parse(body));
        } else {
           res.json(response.statusCode, {'error': 'error'})
        }
});

StrictSSLをtrueとfalseに設定しようとしましたが、どちらもCERT_HAS_EXPIREDと同じエラーを出力しました。この問題の原因は何ですか?また、nodejsで修正する方法はありますか?

41
wwwuser

これをファイルの先頭に追加します。

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

[〜#〜] dangerous [〜#〜]これは、node.js環境全体でHTTPS/SSL/TLSチェックを無効にします。以下のhttpsエージェントを使用したソリューションをご覧ください。

45
Dan Kohn

これを修正する最良の方法:

証明書を更新します。これは、Let's Encrypt™v2を介して証明書を発行する Greenlock を使用して無料で実行できます。

これを修正するless安全でない方法:

'use strict';

var request = require('request');
var agentOptions;
var agent;

agentOptions = {
  Host: 'www.example.com'
, port: '443'
, path: '/'
, rejectUnauthorized: false
};

agent = new https.Agent(agentOptions);

request({
  url: "https://www.example.com/api/endpoint"
, method: 'GET'
, agent: agent
}, function (err, resp, body) {
  // ...
});

agentrejectUnauthorizedを使用すると、ノード全体を完全に処理するのではなく、少なくとも1つのサイトを処理するリクエストにセキュリティの脆弱性を制限することになります。

別のオプション

自己署名証明書を使用している場合、このオプションを追加します。

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

信頼できるピア接続の場合、次の2つのオプションも追加します。

agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;

悪いアイデア

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';も文書化されています。デバッグにのみ使用する必要があり、野生で実行されるような種類のコードにはしないでください。 httpsの上で実行されるほぼすべてのライブラリには、エージェントオプションを渡す方法があります。修正すべきでないもの。

94
CoolAJ86

CoolAJ86によって提案された「安全性が低い」方法を実現するためのより簡潔な方法を次に示します。

request({
  url: url,
  agentOptions: {
    rejectUnauthorized: false
  }
}, function (err, resp, body) {
  // ...
});
17
NTyler

_strictSSL: false_は動作するはずです(2013年であっても動作するはずでした)。つまり、次の3つの方法があります。

  1. (明らか)証明書を更新するためにCAを取得し、サーバーに配置してください!
  2. requestオブジェクトのデフォルト設定を変更します。

    const myRequest = require('request').defaults({strictSSL: false})

    _node-request_を内部的に使用する多くのモジュールでは、request- objectを挿入することもできるため、変更したインスタンスを使用することができます。
  3. (非推奨)allの証明書チェックを上書きallHTTP(S) Node.jsプロセスに環境変数_NODE_TLS_REJECT_UNAUTHORIZED=0_を設定することによるエージェント接続。
8
conny

Request.jsを一時的に変更し、あらゆる場所でharcodeをリジェクトしますrejectUnauthorized = trueですが、証明書を長期的なソリューションとして拡張する方が良いでしょう。

0