Игнорировать недействительный самоподписанный сертификат ssl в node.js с https.request?

Я работаю над небольшим приложением, которое регистрируется на моем локальном беспроводном маршрутизаторе (Linksys), но у меня возникает проблема с самоподписанным сертификатом ssl с маршрутизатором.

Я запустил wget 192.168.1.1 и получил:

ERROR: cannot verify 192.168.1.1 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"?

Ответ 1

Дешевый и небезопасный ответ:

Добавить

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

в коде, перед вызовом https.request()

Более безопасный способ (решение выше делает процесс node небезопасным) в этом question

Ответ 2

В параметрах запроса попробуйте включить следующее:

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

Ответ 3

Добавьте следующую переменную среды:

NODE_TLS_REJECT_UNAUTHORIZED=0

например. с export:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(с большой благодарностью Хуанре)

Ответ 4

Не верьте всем тем, кто пытается ввести вас в заблуждение. в вашем запросе просто добавьте:

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

Если вы включите несанкционированные сертификаты, вы не будете защищены вообще (для использования MITM для проверки подлинности), а работа без ssl не будет большой разницей. решение должно указать сертификат ЦС, который вы ожидаете, как показано в следующем фрагменте. убедитесь, что общее имя сертификата идентично адресу, который вы вызывали в запросе (как указано в хосте): Тогда вы получите следующее:

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
    },

Ответ 5

Добавление в ответ @Armand:

Добавьте следующую переменную среды:

NODE_TLS_REJECT_UNAUTHORIZED = 0, например. с экспортом:

export NODE_TLS_REJECT_UNAUTHORIZED = 0 (с большой благодарностью Хуанре)

Если вы используете Windows:

set NODE_TLS_REJECT_UNAUTHORIZED=0

Благодаря: @weagle08

Ответ 6

Для 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);
});

Ответ 7

Или вы можете попытаться добавить разрешение локального имени (hosts файл, найденный в каталоге etc в большинстве операционных систем, детали отличаются) примерно так:

192.168.1.1 Linksys 

и далее

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

будет работать.