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?

1voto

piaf Punkte 11

Oder Sie können versuchen, eine lokale Namensauflösung hinzuzufügen ( hosts Datei, die im Verzeichnis etc in den meisten Betriebssystemen, Details sind unterschiedlich) etwa so:

192.168.1.1 Linksys 

und weiter

var req = https.request({ 
    host: 'Linksys', 
    port: 443,
    path: '/',
    method: 'GET'
...

wird funktionieren.

1voto

Wenn Sie die Erstellung der Anfrage nicht kontrollieren können

Bei der Verwendung von Paketen haben Sie manchmal nicht die Möglichkeit, die richtigen Einstellungen auf dem request aufzurufen, und das Paket bietet Ihnen auch keine Möglichkeit, eine request .

Dennoch sollten Sie die unsicheren NODE_TLS_REJECT_UNAUTHORIZED=0 und sich dafür entscheiden, nur eine unsichere Verbindung zu einem bestimmten Ziel zu haben.

So habe ich das Problem gelöst:

// check if host and port fit your application
function isSelf(host, port) {
  return host === myHost && port === myPort;
}

// get the built in tls module and overwrite the default connect behavior 
const tls = require("tls");
const _connect = tls.connect;
function wrappedConnect(options, secureConnectListener) {
  if (isSelf(options.host, options.port)) {
    options.rejectUnauthorized = false;
  }
  return _connect(options, secureConnectListener);
}
tls.connect = wrappedConnect;

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