Игнорировать недопустимый самозаверяющий сертификат ssl в узле.js с https.просьба?



Я работаю над небольшим приложением, которое входит в мой локальный беспроводной маршрутизатор (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);
});


как я могу пойти о получении узла.js сделать эквивалент "--no-check-certificate"?

851   8  

8 ответов:

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

добавить

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

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

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

в параметрах запроса, попробуйте в том числе:

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

добавьте следующую переменную окружения:

NODE_TLS_REJECT_UNAUTHORIZED=0

например export:

export NODE_TLS_REJECT_UNAUTHORIZED=0

(С огромное спасибо Juanra)

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

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 для тестирования, чтобы имитировать производственную среду

добавление к ответу @ Armand:

добавьте следующую переменную окружения:

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

экспорт NODE_TLS_REJECT_UNAUTHORIZED=0 (с большой благодарностью Juanra)

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

set NODE_TLS_REJECT_UNAUTHORIZED=0

спасибо: @weagle08

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

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

192.168.1.1 Linksys 

и далее

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

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

вы также можете создать экземпляр запроса с параметрами по умолчанию:

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

Comments

    Ничего не найдено.