webentwicklung-frage-antwort-db.com.de

Node.js-Anforderung CERT_HAS_EXPIRED

Ich verwende die Anfrage von Mikeal ( https://github.com/mikeal/request ), um eine https-Anfrage an einen Server zu stellen. Ich erhalte jedoch weiterhin einen Autorisierungsfehler von CERT_HAS_EXPIRED.

request({
        url: 'https://www.domain.com/api/endpoint',
        strictSSL: false
    }, function(error, response, body) {
        if(!error && response.statusCode == 200) {
            res.json(JSON.parse(body));
        } else {
           res.json(response.statusCode, {'error': 'error'})
        }
});

Ich habe versucht, strictSSL auf true und false zu setzen. Beide geben denselben Fehler von CERT_HAS_EXPIRED aus. Was verursacht dieses Problem und gibt es eine Möglichkeit, es in nodejs zu beheben?

33
wwwuser

Fügen Sie dies am Anfang Ihrer Datei hinzu:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

DANGEROUSDies deaktiviert die HTTPS/SSL/TLS-Prüfung in Ihrer gesamten node.js-Umgebung. Sehen Sie sich die Lösung mit einem https-Agenten unten an.

41
dankohn

Der beste Weg, dies zu beheben:

Erneuern Sie das Zertifikat. Dies kann kostenlos mit Greenlock durchgeführt werden, das Zertifikate über Let's Encrypt ™ v2 ausstellt

Ein less unsicherer Weg, dies zu beheben:

'use strict';

var request = require('request');
var agentOptions;
var agent;

agentOptions = {
  Host: 'www.example.com'
, port: '443'
, path: '/'
, rejectUnauthorized: false
};

agent = new https.Agent(agentOptions);

request({
  url: "https://www.example.com/api/endpoint"
, method: 'GET'
, agent: agent
}, function (err, resp, body) {
  // ...
});

Durch die Verwendung einer agent mit rejectUnauthorized beschränken Sie zumindest die Sicherheitsanfälligkeit auf die Anforderungen, die sich auf diesen einen Standort beziehen, anstatt den gesamten Knotenprozess vollständig und völlig unsicher zu gestalten.

Andere Optionen

Wenn Sie ein selbstsigniertes Zertifikat verwenden, fügen Sie diese Option hinzu:

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

Für vertrauenswürdige Peer-Verbindungen würden Sie auch diese beiden Optionen hinzufügen:

agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;

Schlechte Idee

Es ist bedauerlich, dass process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; sogar dokumentiert ist. Es sollte nur zum Debuggen verwendet werden und sollte niemals in eine Art Code umgewandelt werden, der in der Wildnis läuft. Nahezu jede Bibliothek, die auf https ausgeführt wird, kann Agentenoptionen durchleiten. Diejenigen, die dies nicht tun, sollten behoben werden.

83
CoolAJ86

Hier ist ein kürzerer Weg, um die von CoolAJ86 vorgeschlagene "weniger sichere" Methode zu erreichen

request({
  url: url,
  agentOptions: {
    rejectUnauthorized: false
  }
}, function (err, resp, body) {
  // ...
});
14
NTyler

Ich denke, das strictSSL: false Sollte (hätte auch 2013 funktionieren sollen) funktionieren. Kurz gesagt, es gibt drei Möglichkeiten:

  1. (offensichtlich) Fordern Sie Ihre Zertifizierungsstelle auf, das Zertifikat zu erneuern, und legen Sie es auf Ihrem Server ab!
  2. Ändern Sie die Standardeinstellungen Ihres request Objekts:

    const myRequest = require('request').defaults({strictSSL: false})

    Bei vielen Modulen, die intern node-request Verwenden, kann auch ein request -Objekt eingefügt werden, sodass Sie die geänderte Instanz verwenden können.
  3. (nicht empfohlen) Überschreiben Sie alle Zertifikatsüberprüfungen für alle HTTP (S) -Agentenverbindungen, indem Sie die Umgebungsvariable NODE_TLS_REJECT_UNAUTHORIZED=0 für den Prozess Node.js festlegen.
8
conny

Versuchen Sie, request.js und harcode überall vorübergehend zu ändern rejectUnauthorized = true, aber es ist besser, das Zertifikat als langfristige Lösung zu erweitern.

0