Frage Node.js-Anfrage CERT_HAS_EXPIRED


Ich benutze Mikeals Bitte (https://github.com/mikeal/request) eine https-Anfrage an einen Server zu stellen. Ich bekomme 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 wahr und falsch einzustellen, beide geben den gleichen Fehler von CERT_HAS_EXPIRED aus. Was verursacht dieses Problem und gibt es eine Möglichkeit, es in Nodejs zu beheben?


27
2017-12-06 20:47


Ursprung


Antworten:


Fügen Sie dies am Anfang Ihrer Datei hinzu:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

GEFÄHRLICH Dies deaktiviert die HTTPS / SSL / TLS-Prüfung in Ihrer gesamten node.js-Umgebung. Bitte beachten Sie die Lösung mit einem https-Agenten unten.


41
2017-12-10 14:25



Der beste Weg, dies zu beheben:

Erneuern Sie das Zertifikat. Dies kann kostenlos mit verwendet werden Greenlock Das stellt Zertifikate über Let's Encrypt ™ v2 aus

EIN Weniger 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) {
  // ...
});

Mit einem agent mit rejectUnauthorized Sie beschränken zumindest die Sicherheitslücke auf die Anfragen, die sich mit dieser einen Seite befassen, anstatt Ihren gesamten Knoten vollständig und absolut unsicher zu machen.

Andere Optionen

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

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

Für Trusted-Peer-Verbindungen würden Sie auch diese 2 Optionen hinzufügen:

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

Schlechte Idee

Es ist bedauerlich, dass process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; ist sogar dokumentiert. Es sollte nur für das Debuggen verwendet werden und sollte es niemals in Art von Code machen, der in der Wildnis läuft. Fast jede Bibliothek, die darauf läuft https hat eine Möglichkeit, Agentenoptionen zu übergeben. Diejenigen, die das nicht tun, sollten repariert werden.


72
2018-04-01 17:27



Ich denke der strictSSL: false sollte (hätte auch 2013 noch arbeiten sollen). Kurz gesagt gibt es drei mögliche Wege:

  1. (Offensichtlich) Lassen Sie Ihre Zertifizierungsstelle das Zertifikat erneuern und legen Sie es auf Ihren Server!
  2. Ändern Sie die Standardeinstellungen Ihres request Objekt:

    const myRequest = require('request').defaults({strictSSL: false}) 
     
    Viele Module, die verwenden node-request intern auch erlauben a request-Objekt, das injiziert werden soll, damit Sie Ihre modifizierte Instanz verwenden können.
  3. (nicht empfohlen) Überschreiben alle Zertifikat prüft auf alle HTTP (S) -Agentenverbindungen durch Festlegen der Umgebungsvariablen NODE_TLS_REJECT_UNAUTHORIZED=0 für den Node.js-Prozess.

7
2018-02-27 07:19



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

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

7
2018-03-16 21:44



Versuchen Sie, request.js temporär zu modifizieren und harcode überall abzulehnen. RejectUnauthorized = true, aber es wäre besser, das Zertifikat als langfristige Lösung zu erweitern.


0
2017-12-11 00:09