Игнорировать недопустимый самоподписанный сертификат 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»?

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

Добавить

 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 

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

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

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

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

 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 (с большой благодарностью Хуанре)

Если вы используете 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 }) 
  • Ошибка SSL: certificate_verify_failed при очистке https://www.thenewboston.com/
  • Как правильно импортировать самоподписанный сертификат в хранилище ключей Java, доступное для всех приложений Java по умолчанию?
  • curl: (60) SSL-сертификат: не удалось получить сертификат локального эмитента
  • Безопасное исправление: javax.net.ssl.SSLPeerUnverifiedException: нет однорангового сертификата
  • Не удалось установить пакеты Python
  • Как игнорировать создание пути PKIX не удалось: sun.security.provider.certpath.SunCertPathBuilderException?
  • Ошибка: невозможно проверить первый сертификат в nodejs
  • Как сказать Maven игнорировать ошибки SSL (и доверять всем сертификатам)?
  • Самостоятельный SSL-сертификат Tomcat Server / Client
  • Могу ли я отключить ошибку / предупреждение сертификата в Firefox / Chrome / Internet Explorer?
  • Использовать самоподписанный сертификат cURL?
  • Давайте будем гением компьютера.