Eu estou trabalhando em um pequeno aplicativo que faz o login no meu roteador sem fio local (Linksys), mas estou com um problema com o certificado SSL auto-assinado do roteador.
Eu corri o wget 192.168.1.1 e obtive:
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/emailAddress=support@linksys.com': 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'.
No nó, o erro que está sendo capturado é:
{ [Error: socket hang up] code: 'ECONNRESET' }
Meu código de amostra atual é:
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); });
Como posso obter o node.js para fazer o equivalente a “–no-check-certificate”?
Resposta barata e insegura:
Adicionar
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
no código, antes de chamar https.request()
Uma maneira mais segura (a solução acima torna todo o processo do nó inseguro) é respondida nesta questão
Nas suas opções de solicitação, tente include o seguinte:
var req = https.request({ host: '192.168.1.1', port: 443, path: '/', method: 'GET', rejectUnauthorized: false, requestCert: true, agent: false },
Adicione a seguinte variável de ambiente:
NODE_TLS_REJECT_UNAUTHORIZED=0
por exemplo, com export
:
export NODE_TLS_REJECT_UNAUTHORIZED=0
(com muito obrigado a Juanra)
Não acredite em todos aqueles que tentam enganar você. no seu pedido, basta adicionar:
ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]
Se você ativar certificados não autorizados, você não estará protegido de forma alguma (exposto ao MITM por não validar a identidade), e trabalhar sem SSL não será uma grande diferença. A solução é especificar o certificado de CA que você espera, conforme mostrado no próximo snippet. verifique se o nome comum do certificado é idêntico ao endereço que você chamou na solicitação (conforme especificado no host): O que você obterá então é:
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 },
Por favor, leia este artigo aqui para entender:
Adicionando a resposta @Armand:
Adicione a seguinte variável de ambiente:
NODE_TLS_REJECT_UNAUTHORIZED = 0 eg com exportação:
exportar NODE_TLS_REJECT_UNAUTHORIZED = 0 (com muito obrigado a Juanra)
Se você usa o Windows:
set NODE_TLS_REJECT_UNAUTHORIZED=0
Graças a: @ weagle08
Para meteorJS você pode definir com 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); });
Ou você pode tentar adicionar na resolução do nome local (arquivo hosts
encontrados no diretório etc
na maioria dos sistemas operacionais, os detalhes são diferentes) algo como isto:
192.168.1.1 Linksys
e a seguir
var req = https.request({ host: 'Linksys', port: 443, path: '/', method: 'GET' ...
vai funcionar.
Você também pode criar uma instância de solicitação com opções padrão:
require('request').defaults({ rejectUnauthorized: false })