web-dev-qa-db-fra.com

Node-fetch: désactiver la vérification SSL

J'ai le code suivant, qui est exécuté à partir d'un serveur express:

import fetch from 'node-fetch';

let formBody = [];

const dataLogin = {
      'username': 'myUser',
      'password': 'myPassword'
};

for (let p in dataLogin) {
   let encodedKey = encodeURIComponent(p);
   let encodedValue = encodeURIComponent(dataLogin[p]);
   formBody.Push(encodedKey + "=" + encodedValue);
 }

 formBody = formBody.join("&");   

 const url = 'https://external-login-api.com';
 return fetch(url, {
          method: 'POST',
          headers: {
              'Content-Type': 'application/x-www-form-urlencoded',
              'Content-Length': formBody.length         
  },     
  body: formBody
 });

Lorsque j'exécute le code, j'obtiens l'erreur suivante, bien que je puisse exécuter la demande dans Postman sans problème.

{"message": "demande à https://external-login-api.com échec, raison: écriture EPROTO 7316: erreur: 141A318A: routines SSL: tls_process_ske_dhe: clé dh trop petite: openssl\ssl\statem\statem_clnt.c: 1472:\n "," type ":" système "," errno ":" EPROTO "," code ":" EPROTO "}

Comment désactiver la vérification SSL pour cette demande?

8
Allan Christian
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

S'assurera que vous ignorez tous les certificats TLS rejetés, ou vous pouvez le définir comme variable d'environnement lors de l'exécution de votre service de noeud. Cependant, cela n'aidera probablement pas, et c'est probablement une mauvaise idée. L'erreur SSL n'est pas parce que le certificat n'est pas valide (comme un certificat auto-signé) mais à la place à cause d'une clé Diffie-Hellman faible dans la configuration SSL/TLS.

Si c'est un service que vous hébergez, vous devriez chercher à corriger et à améliorer vos cyphers TLS/SSL. Voir cette réponse pour plus d'informations .

La partie importante est:

Vous devez utiliser des groupes Diffie-Hellman de 2048 bits ou plus. Vous ne devez pas utiliser de groupes Diffie-Hellman 512 bits ou 1024 bits.

S'il s'agit d'un service tiers, vous devriez envisager de les contacter ou d'utiliser un service différent car ils se laissent ouverts à Logjam attack qui est également abordé dans la réponse liée ci-dessus.

16
Elliot Blackburn

L'autre façon de procéder consiste à définir votre propre agent sur l'appel de récupération.

const fetch = require('node-fetch');
const https = require('https');

const httpsAgent = new https.Agent({
      rejectUnauthorized: false,
    });

const response = await fetch(url, {
      method: 'POST',
      headers: headers,
      body: body,
      agent: httpsAgent,
    });
1
Karthik