372

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

私はwget192.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」と同等の処理を実行させるにはどうすればよいですか?

4

11 に答える 11

733

安くて安全でない答え:

追加

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

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

より安全な方法(上記の解決策はノードプロセス全体を安全でないものにします)は、この質問で答えられます

于 2014-02-22T21:45:27.470 に答える
192

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

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },
于 2012-06-14T23:37:51.803 に答える
73

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

リクエストに次を追加するだけです。

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証明書を簡単に生成する方法
于 2016-08-23T10:51:04.713 に答える
64

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

NODE_TLS_REJECT_UNAUTHORIZED=0

export

export NODE_TLS_REJECT_UNAUTHORIZED=0

(Juanraに感謝します)

于 2015-05-25T12:17:16.143 に答える
18

@Armandの回答に追加:

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

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

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

Windowsを使用している場合:

set NODE_TLS_REJECT_UNAUTHORIZED=0

おかげで:@ weagle08

于 2016-08-23T06:26:52.940 に答える
16

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

require('request').defaults({ rejectUnauthorized: false })
于 2018-05-23T17:16:35.043 に答える
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);
});
于 2016-01-04T07:08:13.367 に答える
1

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

192.168.1.1 Linksys 

そして次

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

動作します。

于 2012-10-10T18:29:00.700 に答える
1

そのため、私の会社はNode.jsv12.xに切り替えました。を使用NODE_TLS_REJECT_UNAUTHORIZEDしていたのですが、動作しなくなりました。少し掘り下げた後NODE_EXTRA_CA_CERTS=A_FILE_IN_OUR_PROJECT、自己署名証明書のPEM形式で使用を開始し、すべてのスクリプトが再び機能しています。

したがって、プロジェクトに自己署名証明書がある場合は、おそらくこのenvvarが役立ちます。

参照:https ://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file

于 2020-11-17T23:51:30.130 に答える
0

NODE_TLS_REJECT_UNAUTHORIZED=0をエクスポートしてみてください

于 2020-10-07T18:07:10.127 に答える
0

リクエストの作成を制御できない場合

パッケージを使用する場合、呼び出しで正しい設定を設定するオプションがない場合requestや、パッケージにを挿入する方法がない場合がありますrequest

ただし、安全でないものを避け、NODE_TLS_REJECT_UNAUTHORIZED=0指定されたターゲットへの安全でない接続のみを選択することもできます。

これが私が問題を解決した方法です:

// check if host and port fit your application
function isSelf(host, port) {
  return host === myHost && port === myPort;
}

// get the built in tls module and overwrite the default connect behavior 
const tls = require("tls");
const _connect = tls.connect;
function wrappedConnect(options, secureConnectListener) {
  if (isSelf(options.host, options.port)) {
    options.rejectUnauthorized = false;
  }
  return _connect(options, secureConnectListener);
}
tls.connect = wrappedConnect;
于 2022-02-25T16:00:10.307 に答える