Ответ 1
Дешевый и небезопасный ответ:
Добавить
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
в коде, перед вызовом https.request()
Более безопасный способ (решение выше делает процесс node небезопасным) в этом question
Я работаю над небольшим приложением, которое регистрируется на моем локальном беспроводном маршрутизаторе (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"?
Дешевый и небезопасный ответ:
Добавить
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
в коде, перед вызовом https.request()
Более безопасный способ (решение выше делает процесс node небезопасным) в этом question
В параметрах запроса попробуйте включить следующее:
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 не будет большой разницей. решение должно указать сертификат ЦС, который вы ожидаете, как показано в следующем фрагменте. убедитесь, что общее имя сертификата идентично адресу, который вы вызывали в запросе (как указано в хосте): Тогда вы получите следующее:
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
},
Добавление в ответ @Armand:
Добавьте следующую переменную среды:
NODE_TLS_REJECT_UNAUTHORIZED = 0, например. с экспортом:
export NODE_TLS_REJECT_UNAUTHORIZED = 0 (с большой благодарностью Хуанре)
Если вы используете 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'
...
будет работать.