Ich verwende Mikeals Anfrage (https://github.com/mikeal/request), um eine https-Anfrage an einen Server zu senden. Ich erhalte jedoch immer wieder 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 den gleichen Fehler von CERT_HAS_EXPIRED aus. Was verursacht dieses Problem und gibt es eine Möglichkeit, es in nodejs zu beheben?

62
wwwuser 7 Dez. 2013 im 00:47

4 Antworten

Beste Antwort

Fügen Sie dies oben in Ihrer Datei hinzu:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

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

53
mikemaccana 22 Feb. 2016 im 15:08

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
Angular University 11 Dez. 2013 im 00:09

Der beste Weg, dies zu beheben:

Erneuern Sie das Zertifikat. Dies kann kostenlos mithilfe von Greenlock erfolgen, das Zertifikate über Let's Encrypt ™ v2 ausstellt

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

Durch die Verwendung eines agent mit rejectUnauthorized beschränken Sie die Sicherheitslücke zumindest auf die Anforderungen, die sich auf diese eine Site beziehen, anstatt Ihren gesamten Knotenprozess vollständig und absolut unsicher zu machen.

Andere Optionen

Wenn Sie ein selbstsigniertes Zertifikat verwenden, fügen Sie folgende 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'; sogar dokumentiert ist. Es sollte nur zum Debuggen verwendet werden und niemals in Code umgewandelt werden, der in freier Wildbahn ausgeführt wird. Fast jede Bibliothek, die auf https ausgeführt wird, kann Agentenoptionen weiterleiten. Diejenigen, die dies nicht tun, sollten behoben werden.

110
CoolAJ86 20 Mai 2018 im 00:27

Hier ist ein präziserer Weg, um die von CoolAJ86 vorgeschlagene "weniger unsichere" Methode zu erreichen

request({
  url: url,
  agentOptions: {
    rejectUnauthorized: false
  }
}, function (err, resp, body) {
  // ...
});
22
Robert Taylor 28 März 2019 im 15:17