web-dev-qa-db-fra.com

Demande Node.js CERT_HAS_EXPIRED

J'utilise la demande de Mikeal ( https://github.com/mikeal/request ) de faire une demande https à un serveur. Cependant, je continue à recevoir une erreur d'autorisation de 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'})
        }
});

J'ai essayé de définir strictSSL sur true et false, les deux générant la même erreur de CERT_HAS_EXPIRED. Qu'est-ce qui cause ce problème et est-il possible de le résoudre dans nodejs?

33
wwwuser

Ajoutez ceci en haut de votre fichier:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

DANGEROUSCeci désactive la vérification HTTPS/SSL/TLS sur l'ensemble de votre environnement node.js. Veuillez consulter la solution utilisant un agent https ci-dessous.

41
dankohn

La meilleure façon de résoudre ce problème:

Renouveler le certificat. Cela peut être fait gratuitement avec Greenlock qui émet des certificats via Let's Encrypt ™ v2

Une _ moins manière peu sûre de résoudre ce problème:

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

En utilisant une variable agent avec rejectUnauthorized, vous limitez au moins la vulnérabilité de la sécurité aux demandes qui traitent ce site, au lieu de rendre votre processus de nœud complet, complètement non sécurisé.

Autres options

Si vous utilisiez un certificat auto-signé, vous ajouteriez cette option:

agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

Pour les connexions de confiance, ajoutez également ces 2 options:

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

Mauvaise idée

Il est regrettable que process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; soit même documenté. Il ne devrait être utilisé que pour le débogage et ne devrait jamais en faire une sorte de code qui tourne à l'état sauvage. Presque toutes les bibliothèques qui fonctionnent au-dessus de https disposent d'un moyen de transmettre les options de l'agent. Ceux qui ne le devraient pas devraient être corrigés.

83
CoolAJ86

Voici un moyen plus concis de réaliser la méthode "moins sécurisée" proposée par CoolAJ86

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

Essayez de modifier temporairement request.js et harcode partoutjecterunauthorized = true, mais il serait préférable d’étendre le certificat comme solution à long terme.

0
Angular University