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?

17voto

Eduardo Punkte 5014

Sie können auch eine Anforderungsinstanz mit Standardoptionen erstellen:

require('request').defaults({ rejectUnauthorized: false })

13voto

wayneseymour Punkte 305

Also, mein Unternehmen hat gerade auf Node.js v12.x umgestellt. Ich benutzte NODE_TLS_REJECT_UNAUTHORIZED und es funktionierte nicht mehr. Nach einigem Suchen begann ich mit NODE_EXTRA_CA_CERTS=A_FILE_IN_OUR_PROJECT die ein PEM-Format unseres selbstsignierten Zertifikats hat, und alle meine Skripte funktionieren wieder.

Wenn Ihr Projekt also selbstsignierte Zertifikate hat, hilft Ihnen vielleicht diese env var.

Ref: https://nodejs.org/api/cli.html#cli_node_extra_ca_certs_file

6voto

Meeraj Kanaparthi Punkte 286

Versuchen Sie export NODE_TLS_REJECT_UNAUTHORIZED=0

3voto

digz6666 Punkte 1778

Für MeteorJS können Sie mit npmRequestOptions einstellen.

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

2voto

iravinandan Punkte 549

Für den Fall, dass Sie einen Beitrag mit @nestjs/axios suchen,

Hier ist die Syntax ohne Zertifikat (Non Production Solution):

const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')

const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Basic ${token}`,
      },
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      }),
    };

const responseData = await firstValueFrom(
        this.httpService.post(url, data, config).pipe(map((response) => response.data)),
      );

Hier ist die Syntax mit Zertifikat (Produktionslösung):

const token = Buffer.from(`${user}:${password}`,'utf8').toString('base64')

const config = {
      headers: {
        'Content-Type': 'application/json',
        Authorization: `Basic ${token}`,
      },
      httpsAgent: new https.Agent({
        rejectUnauthorized: true,
        ca: fs.readFileSync(path.join(__dirname, './resources/certificateName'))
      }),
    };

const responseData = await firstValueFrom(
        this.httpService.post(url, data, config).pipe(map((response) => response.data)),
      );

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