435 Stimmen

Ungültiges selbstsigniertes SSL-Zertifikat in node.js mit https.request ignorieren?

Ich arbeite an einer kleinen App, die sich bei meinem lokalen WLAN-Router (Linksys) anmeldet, aber ich stoße auf ein Problem mit dem selbstsignierten SSL-Zertifikat des Routers.

Ich habe wget 192.168.1.1 ausgeführt und erhalte:

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

In node wird der Fehler abgefangen:

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

Mein aktueller Beispielcode ist:

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

Wie kann ich node.js dazu bringen, das Äquivalent von "--no-check-certificate" zu tun?

830voto

Juanra Punkte 8282

Eine billige und unsichere Antwort:

hinzufügen

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

im Code, bevor Sie https.request()

Eine sicherere Methode (die obige Lösung macht den gesamten Knotenprozess unsicher) wird folgendermaßen beantwortet Frage

200voto

Meg Sharkey Punkte 2055

Versuchen Sie, in Ihren Anfrageoptionen Folgendes anzugeben:

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

91voto

Armand Punkte 22095

Fügen Sie die folgende Umgebungsvariable hinzu:

NODE_TLS_REJECT_UNAUTHORIZED=0

z.B. mit export :

export NODE_TLS_REJECT_UNAUTHORIZED=0

(mit großem Dank an Juanra)

83voto

Hesham Yassin Punkte 4201

Glauben Sie nicht all denen, die versuchen, Sie in die Irre zu führen.

Fügen Sie in Ihrem Antrag einfach hinzu:

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

Wenn Sie nicht autorisierte Zertifikate aktivieren, sind Sie überhaupt nicht geschützt (Sie sind MITM ausgesetzt, weil Ihre Identität nicht validiert wird), und das Arbeiten ohne SSL wird keinen großen Unterschied machen. Die Lösung besteht darin, das erwartete CA-Zertifikat anzugeben, wie im nächsten Ausschnitt gezeigt. Vergewissern Sie sich, dass der Common Name des Zertifikats mit der Adresse identisch ist, die Sie in der Anfrage aufgerufen haben (wie im Host angegeben):

Was Sie dann erhalten, ist:

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

Bitte lesen dieser Artikel (Hinweis: Der Autor dieser Antwort hat den Blogbeitrag verfasst), um zu verstehen:

  • Wie CA-Zertifikate funktionieren
  • Wie erzeugt man CA-Zertifikate für Tests, um die Produktionsumgebung zu simulieren?

25voto

hackp0int Punkte 3982

Ich ergänze die Antwort von @Armand:

Fügen Sie die folgende Umgebungsvariable hinzu:

NODE_TLS_REJECT_UNAUTHORIZED=0 z.B. mit export:

export NODE_TLS_REJECT_UNAUTHORIZED=0 (mit großem Dank an Juanra)

Wenn Sie auf Windows verwenden:

set NODE_TLS_REJECT_UNAUTHORIZED=0

Dank an: @weagle08

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X