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