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

Я работаю над небольшим приложением, которое подключается к моему локальному беспроводному маршрутизатору (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/[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'.

В узле обнаруживается ошибка:

{ [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"?

Ответы на вопрос(8)

Решение Вопроса

добавлять

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

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

Ответ на более безопасный способ (решение выше делает весь процесс узла незащищенным)вопрос

 30 июл. 2015 г., 16:33
У меня были проблемы с запуском тестов с использованием mocha на моем самозаверяющем сервере узлов https и добавлением этого непосредственно перед тем, как какие-либо блоки описаний сделали мои тесты успешными.
 29 сент. 2014 г., 17:01
Это также сработало для NodeJS & amp; SailJS combo. Я добавил его в начало local.js
 17 сент. 2014 г., 17:30
Где в коде это должно быть добавлено?
 24 янв. 2015 г., 03:17
Не используйте это или & quot; rejectUnauthorized & quot; в производственной среде, поскольку это отключает все виды проверок безопасности.
 20 сент. 2014 г., 02:33
Работал как шарм для меня! Я разместил этот код сразу после того, как включил все в самый верх моего основного приложения js.

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

В вашем запросе просто добавьте:

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

Пожалуйста, прочитайтеЭта статья (раскрытие: сообщение в блоге, написанное автором этого ответа) здесь, чтобы понять:

How CA Certificates work How to generate CA Certs for testing easily in order to simulate production environment
 18 янв. 2019 г., 20:37
почему вы помещаете fs.readFileSync в скобки, а не храните его в виде строки?
 02 февр. 2018 г., 08:26
Это работает и является правильным способом решения проблемы. «Ошибка: самозаверяющий сертификат в цепочке сертификатов».

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

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

NODE_TLS_REJECT_UNAUTHORIZED=0

например сexport:

export NODE_TLS_REJECT_UNAUTHORIZED=0

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

 12 сент. 2017 г., 15:07
установите NODE_TLS_REJECT_UNAUTHORIZED = 0 для окон
 16 нояб. 2016 г., 19:47
Это сработало для меня при попытке запуститьwebdriver-manager update

Add the following environment variable:

NODE_TLS_REJECT_UNAUTHORIZED=0 e.g. with export:

export NODE_TLS_REJECT_UNAUTHORIZED=0 (with great thanks to Juanra)

If you on windows usage:

set NODE_TLS_REJECT_UNAUTHORIZED=0

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

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

192.168.1.1 Linksys 

и следующий

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

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

 20 мар. 2014 г., 04:40
@reza: добавьте это к вашим опциям:rejectUnauthorized: false
 31 окт. 2013 г., 16:44
Так как же обойти DEPTH_ZERO_SELF_SIGNED_CERT? Я сталкиваюсь с этим сейчас.
 26 апр. 2013 г., 16:24
Да, это может ответить на вопрос, но я думаю, что следующей ошибкой будет DEPTH_ZERO_SELF_SIGNED_CERT в этом случае.
 09 дек. 2014 г., 15:36
Я знаю, что это немного устарело, но для дальнейшего использования (для того, чтобы сделать это правильно), вам нужно получить PEM-кодировку самоподписанного сертификата и включить его в параметры в качестве CA (вам, очевидно, также нужен установить значение агента, но это может быть ложным). Поскольку сертификат самоподписан, он действует как собственный ЦС и, следовательно, может использоваться для самопроверки. Однако я также хотел бы спросить, действительно ли это стоит делать на маршрутизаторе, поскольку микропрограммное обеспечение может быть загружено и, следовательно, закрытый ключ может быть легко взломан.

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },
 29 июл. 2016 г., 16:08
Ну, это сработало для меня только сrejectUnauthorized вариант и больше ничего
 26 апр. 2013 г., 16:18
Работал на меня. Я использую рестлер и вижу, что по умолчанию параметры не пересылаются, поэтому мне пришлось его исправлять.
 27 июл. 2015 г., 14:55
Чтобы это работало, вам нужно предоставить явный экземпляр пользовательского агента. Создайте объект параметров и задайте агент: «параметры.агент = новый https.Agent (параметры);»; Затем просто позвоните в «https.request (параметры)».

Ваш ответ на вопрос