web-dev-qa-db-ja.com

https.requestを使用してnode.js内の無効な自己署名SSL証明書を無視しますか?

私は自分のローカル無線ルーター(Linksys)にログインする小さなアプリを開発していますが、ルーターの自己署名SSL証明書に問題があります。

私は192.168.1.1とwgetを実行して取得:

ERROR: cannot verify 192.168.1.1's certificate, issued by `/C=US/ST=California/L=Irvine/O=Cisco-Linksys, LLC/OU=Division/CN=Linksys/[email protected]':
Self-signed certificate encountered.
ERROR: certificate common name `Linksys' doesn't match requested Host name `192.168.1.1'.
To connect to 192.168.1.1 insecurely, use `--no-check-certificate'.

Nodeでは、キャッチされているエラーは次のとおりです。

{ [Error: socket hang up] code: 'ECONNRESET' }

私の現在のサンプルコードは次のとおりです。

var req = https.request({ 
    Host: '192.168.1.1', 
    port: 443,
    path: '/',
    method: 'GET'

}, function(res){

    var body = [];
    res.on('data', function(data){
        body.Push(data);
    });

    res.on('end', function(){
        console.log( body.join('') );
    });

});
req.end();

req.on('error', function(err){
    console.log(err);
});

Node.jsに "--no-check-certificate"と同等の機能を持たせるにはどうすればよいですか?

250
Geuis

安くて安全でない答え:

追加する

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

https.request()を呼び出す前に、コードで

より安全な方法(上記の解決法ではノード全体のプロセスが安全ではなくなる)がこの質問 で答えられます

504
Juanra

リクエストオプションに、次のものを含めてみてください。

   var req = https.request({ 
      Host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },
140
Meg Sharkey

あなたを誤解させようとするすべての人を信じてはいけません。

あなたの要求では、単に追加してください:

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]

不正な証明書を有効にした場合、あなたはまったく保護されず(本人確認を行わないためにMITMに公開される)、SSLなしで作業しても大きな違いはありません。解決策は、次のスニペットに示すように、予想されるCA証明書を指定することです。証明書の共通名が、要求で呼び出したアドレスと同じであることを確認します(ホストで指定されているとおり)。

あなたがそれから得るものは:

var req = https.request({ 
      Host: '192.168.1.1', 
      port: 443,
      path: '/',
      ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
      method: 'GET',
      rejectUnauthorized: true,
      requestCert: true,
      agent: false
    },

理解するためにここに この記事 (開示:この回答の著者によって書かれたブログ記事)を読んでください:

  • CA証明書のしくみ
  • 実稼働環境をシミュレートするためにテスト用のCA証明書を簡単に生成する方法
50
Hesham Yassin

以下の環境変数を追加します。

NODE_TLS_REJECT_UNAUTHORIZED=0

例えばexportを使う:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(Juanraに感謝します)

41
Armand

@Armandの回答に追加する:

以下の環境変数を追加します。

NODE_TLS_REJECT_UNAUTHORIZED = 0輸出と:

nODE_TLS_REJECT_UNAUTHORIZED = 0をエクスポート(Juanraに感謝します)

あなたがウィンドウズを使っているなら:

set NODE_TLS_REJECT_UNAUTHORIZED=0

おかげで:@ weagle08

12
IamStalker

デフォルトのオプションでリクエストインスタンスを作成することもできます。

require('request').defaults({ rejectUnauthorized: false })
7
Eduardo

MeteorJSの場合は、npmRequestOptionsで設定できます。

HTTP.post(url, {
    npmRequestOptions: {
        rejectUnauthorized: false // TODO remove when deploy
    },
    timeout: 30000, // 30s
    data: xml
}, function(error, result) {
    console.log('error: ' + error);
    console.log('resultXml: ' + result);
});
3
digz6666

あるいは、次のようにローカルの名前解決(ほとんどのオペレーティングシステムではhostsファイルがディレクトリetcにあります、詳細は異なります)を追加することもできます。

192.168.1.1 Linksys 

そして次に

var req = https.request({ 
    Host: 'Linksys', 
    port: 443,
    path: '/',
    method: 'GET'
...

働くでしょう。

1
piaf