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


309

ローカルワイヤレスルーター(Linksys)にログインする小さなアプリで作業していますが、ルーターの自己署名SSL証明書で問題が発生しています。

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

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/emailAddress=support@linksys.com':
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'.

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

{ [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」と同等のことを実行するにはどうすればよいですか?

回答:


600

安くて不安な答え:

追加

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

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

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


2
私の魅力のように働いた!このコードは、すべてをメインアプリケーションのjsの最上部に含めた直後に配置しました。
Xedecimal 2014

これはNodeJSとSailJSのコンボでも機能しました。local.jsの上部に追加しました
Michael Kork。

38
これまたはすべての種類のセキュリティチェックを無効にするので、運用環境で「rejectUnauthorized」を使用しないでください。
Jason Walton

3
自己署名のhttpsノードサーバーでmochaを使用してテストを実行し、describeブロックがテストをパスする直前にこれを追加することに問題がありました。
artis3n 2015

これはおそらく問題を解決する最も安全な方法ではありません。stackoverflow.com/questions/20433287/…を
Matt Pennington

166

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

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

私のために働いた。私はRestlerを使用していますが、デフォルトではオプションを転送しないので、パッチを適用する必要がありました。
Olivier Amblet 2013

2
これを機能させるには、カスタムエージェントの明示的なインスタンスを提供する必要があります。オプションオブジェクトを作成し、エージェントを設定します。 'options.agent = new https.Agent(options);' 次に、 'https.request(options)'を呼び出します
最大

14
まあ、これはただで私のために働いrejectUnauthorizedオプションと他には何も
mcont

@mcont私rejectUnauthorizedは他のすべてがootbで十分良かったことを確認します。内vsコード拡張を使用します。PEM構成をより適切に許可します。次はそれを行います...
escape-llc

61

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

リクエストに、以下を追加してください:

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

不正な証明書を有効にすると、保護されなくなり(IDを検証しないために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証明書を簡単に生成する方法

7
これは機能し、「エラー:証明書チェーン内の自己署名証明書」という問題を修正する正しい方法です。
RohanRasane

1
文字列として保存するのではなく、なぜfs.readFileSyncを角かっこ内に置くのですか?
Lelo

Lelo:括弧はそれを配列に変えます。ca:証明書の配列が必要です。このファイルは、証明書のコンマ区切りリストである必要があります。多くの場合、内部関数を使用してPEMファイルを配列に変換します。自己署名入り証明書の場合、単一の証明書が「機能するはずです」。
JohnDavid

53

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

NODE_TLS_REJECT_UNAUTHORIZED=0

export

export NODE_TLS_REJECT_UNAUTHORIZED=0

(フアンラのおかげで)


これは私が走ろうとしたときにうまくwebdriver-manager update
アシュリー

3
WindowsでNODE_TLS_REJECT_UNAUTHORIZED = 0を設定
Felipe SS

これは私の開発環境に最適なソリューションでした
David

14

@Armand回答に追加:

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

NODE_TLS_REJECT_UNAUTHORIZED = 0例:エクスポート:

NODE_TLS_REJECT_UNAUTHORIZED = 0(Juanraに感謝)

Windowsを使用している場合:

set NODE_TLS_REJECT_UNAUTHORIZED=0

おかげで:@ weagle08


12

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

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

3

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);
});

1

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

192.168.1.1 Linksys 

そして次は

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

動作します。


3
これは質問に答えるかもしれませんが、次のエラーはこの場合DEPTH_ZERO_SELF_SIGNED_CERTになると思います。
Olivier Amblet 2013

1
では、どのようにしてDEPTH_ZERO_SELF_SIGNED_CERTを回避するのでしょうか。私は今、それに遭遇しています。
reza 2013年

3
@reza:これをオプションに追加してください:rejectUnauthorized: false
Obay

1
私はこれが少し古いことを知っていますが、(これを正しい方法で行うために)将来の参照のために、自己署名証明書のPEMエンコードを取得し、それをCAとしてオプションに含める必要があります(明らかに、エージェント値を設定しますが、それはfalseの場合もあります)。証明書は自己署名されているため、独自のCAとして機能し、それ自体を検証するために使用できます。ただし、ファームウェアがダウンロードされる可能性があり、秘密鍵が簡単に侵害される可能性があるため、ルーターで実行する価値があるかどうかについても質問します。
ジョナサングレイ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.