Ignora il certificato ssl autofirmato non valido in node.js con https.request?


2 Answers

Nelle opzioni di richiesta, prova a includere quanto segue:

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },
Question

Sto lavorando su una piccola app che accede al mio router wireless locale (Linksys) ma sto riscontrando un problema con il certificato ssl autofirmato del router.

Ho eseguito wget 192.168.1.1 e ottenuto:

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'.

Nel nodo, l'errore rilevato è:

{ [Error: socket hang up] code: 'ECONNRESET' }

Il mio codice di esempio corrente è:

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

Come posso ottenere che node.js faccia l'equivalente di "--no-check-certificate"?




non credere a tutti quelli che cercano di ingannarti. nella tua richiesta, aggiungi semplicemente:

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

Se attivi certificati non autorizzati, non sarai affatto protetto (esposto al MITM per non aver convalidato l'identità), e lavorare senza ssl non sarà una grande differenza. la soluzione è specificare il certificato CA che ti aspetti, come mostrato nel frammento successivo. assicurati che il nome comune del certificato sia identico all'indirizzo che hai chiamato nella richiesta (come specificato nell'host): Ciò che otterrai sarà:

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

Si prega di leggere questo articolo qui per capire:

  • Come funzionano i certificati CA.
  • Come generare CA Certs per testare facilmente per simulare l'ambiente di produzione



Per meteorJS puoi impostare con 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);
});



Related