412 votes

Ignorer un certificat ssl auto-signé invalide dans node.js avec https.request ?

Je travaille sur une petite application qui se connecte à mon routeur sans fil local (Linksys) mais je rencontre un problème avec le certificat SSL auto-signé du routeur.

J'ai lancé wget 192.168.1.1 et j'ai obtenu :

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'.

Dans le nœud, l'erreur détectée est la suivante :

{ [Error: socket hang up] code: 'ECONNRESET' }

Mon exemple de code actuel est :

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

Comment puis-je faire en sorte que node.js fasse l'équivalent de "--no-check-certificate" ?

792voto

Juanra Points 203

Réponse bon marché et peu sûre :

Ajouter

process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0;

dans le code, avant d'appeler https.request()

Une manière plus sûre (la solution ci-dessus rend le processus de nœud entier non sécurisé) est répondue dans ceci question

2 votes

Cela a fonctionné comme un charme pour moi ! J'ai placé ce code juste après avoir tout inclus, tout en haut de mon application principale js.

0 votes

Cela a également fonctionné pour le combo NodeJS & SailJS. Je l'ai ajouté en haut du fichier local.js

51 votes

N'utilisez pas cette option ou "rejectUnauthorized" dans un environnement de production, car elle désactive toutes sortes de contrôles de sécurité.

196voto

Meg Sharkey Points 261

Dans les options de votre demande, essayez d'inclure les éléments suivants :

   var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      method: 'GET',
      rejectUnauthorized: false,
      requestCert: true,
      agent: false
    },

2 votes

Cela a fonctionné pour moi. J'utilise restler et j'ai vu qu'il ne transmettait pas les options par défaut, j'ai donc dû le corriger.

2 votes

Pour que cela fonctionne, vous devez fournir une instance explicite d'un agent personnalisé. Créez l'objet options et définissez l'agent : 'options.agent = new https.Agent(options);' Puis appelez simplement 'https.request(options)'

24 votes

Cela a fonctionné pour moi avec seulement le rejectUnauthorized et rien d'autre

78voto

Hesham Yassin Points 362

Ne croyez pas tous ceux qui essaient de vous induire en erreur.

Dans votre demande, il suffit d'ajouter :

ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})]

Si vous activez les certificats non autorisés, vous ne serez pas du tout protégé (exposé au MITM pour ne pas avoir validé l'identité), et travailler sans SSL ne sera pas une grande différence. La solution consiste à spécifier le certificat de l'autorité de certification que vous attendez, comme indiqué dans l'extrait suivant. Assurez-vous que le nom commun du certificat est identique à l'adresse que vous avez appelée dans la requête (comme spécifié dans l'hôte) :

Ce que vous obtiendrez alors est :

var req = https.request({ 
      host: '192.168.1.1', 
      port: 443,
      path: '/',
      ca: [fs.readFileSync([certificate path], {encoding: 'utf-8'})],
      method: 'GET',
      rejectUnauthorized: true,
      requestCert: true,
      agent: false
    },

Veuillez lire cet article (divulgation : article de blog écrit par l'auteur de cette réponse) ici afin de comprendre :

  • Comment fonctionnent les certificats CA
  • Comment générer facilement des certificats CA pour les tests afin de simuler un environnement de production ?

9 votes

Cela fonctionne et c'est la bonne façon de résoudre le problème "Error : self signed certificate in certificate chain." (Erreur : certificat auto-signé dans la chaîne de certificats).

1 votes

Pourquoi mettre fs.readFileSync entre parenthèses, au lieu de le stocker sous forme de chaîne de caractères ?

0 votes

Lelo : brackets le transforme en tableau. ca : attend un tableau de certificats. Ce fichier doit être une liste de certificats séparés par des virgules, souvent les gens utilisent une fonction interne pour transformer un fichier PEM en un tableau. Pour un certificat auto-signé, un seul certificat devrait fonctionner.

74voto

Armand Points 4075

Ajoutez la variable d'environnement suivante :

NODE_TLS_REJECT_UNAUTHORIZED=0

par exemple avec export :

export NODE_TLS_REJECT_UNAUTHORIZED=0

(avec un grand merci à Juanra)

0 votes

Cela a fonctionné pour moi lorsque j'ai essayé d'exécuter webdriver-manager update

5 votes

Set NODE_TLS_REJECT_UNAUTHORIZED=0 pour Windows

1 votes

C'était une excellente solution pour mon environnement de développement

24voto

IamStalker Points 2474

Ajout à la réponse de @Armand :

Ajoutez la variable d'environnement suivante :

NODE_TLS_REJECT_UNAUTHORIZED=0 par exemple avec l'exportation :

export NODE_TLS_REJECT_UNAUTHORIZED=0 (avec un grand merci à Juanra)

Si vous utilisez Windows :

set NODE_TLS_REJECT_UNAUTHORIZED=0

Merci à : @weagle08

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X