Ignorar certificado ssl auto-assinado inválido em node.js com https.request?

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:

    • Como os certificados de CA funcionam
    • Como gerar certificados de CA para testar facilmente para simular o ambiente de produção

    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 })