web-dev-qa-db-fra.com

Comment configurer axios pour utiliser le certificat SSL?

J'essaie de faire une demande avec axios à un point de terminaison api et j'obtiens l'erreur suivante: Error: unable to verify the first certificate

Il semble que le module https, utilisé par axios, ne puisse pas vérifier le certificat SSL utilisé sur le serveur.

Lors de la visite du serveur avec mon navigateur, le certificat est valide et je peux le voir/le télécharger. Je peux également faire des demandes à l'API de mon navigateur via https.

Je peux y remédier en désactivant la vérification. Ce code fonctionne.

const result = await axios.post(
    `https://${url}/login`,
    body,
    {
      httpsAgent: new https.Agent({
        rejectUnauthorized: false
      })
    }
  )

Le problème, c'est que cela ne vérifie pas le certificat SSL et ouvre donc des failles de sécurité.

Comment configurer axios pour faire confiance au certificat et le vérifier correctement?

4
Jemi Salo

Vieille question, mais signalons à ceux qui atterrissent ici. Aucun expert. S'il vous plaît consulter vos gourous de la sécurité locale et ce qui ne l'est pas.

Axios est un client http (s) et les clients http participent généralement de manière anonyme à TLS. En d'autres termes, le serveur accepte leur connexion sans identifier qui tente de se connecter. Ceci est différent, puis dites mutuellement, TLS où le serveur et le client se vérifient avant de terminer la négociation. 

Internet est un lieu effrayant et nous souhaitons empêcher nos clients de se connecter à des terminaux publics usurpés. Pour ce faire, nous veillons à ce que nos clients identifient le serveur avant d’envoyer des données privées.

// DO NOT DO THIS IF SHARING PRIVATE DATA WITH SERVICE
const httsAgent = new https.Agent({ rejectUnauthorized: false });

Ceci est souvent publié (et plus voté de manière flagrante) comme la réponse à StackOverflow concernant les échecs de connexion client https dans toutes les langues. Et ce qui est pire, c’est que cela fonctionne habituellement, débloque le dev et ils avancent à leur aise. Cependant, alors qu'ils entrent certainement dans la porte, à qui appartient-elle? Depuis qu’ils ont décidé de ne pas vérifier l’identité du serveur, leur client pauvre n’a aucun moyen de savoir si la connexion qu’ils viennent de faire avec l’intranet de la société a de mauvais acteurs à l’écoute. 

Si le service dispose d'un certificat SSL public, il n'est généralement pas nécessaire de configurer davantage le https.Agent car votre système d'exploitation fournit un ensemble commun de certificats d'autorité de certification publiquement approuvés. Il s’agit généralement du même ensemble de certificats de certificat que votre navigateur est configuré pour utiliser. C’est pourquoi un client axios par défaut peut frapper https://google.com sans problème.

Si le service dispose d'un certificat SSL privé (auto-signé à des fins de test ou signé par l'autorité de certification privée de votre société pour protéger leurs secrets internes), l'agent https doit être configuré pour faire confiance à l'autorité de certification privée utilisée pour signer le certificat de serveur:

const httpsAgent = new https.Agent({ ca: MY_CA_BUNDLE });

MY_CA_BUNDLE est un tableau de certificats de certification au format .pem.

6
srquinn

Créez un agent personnalisé avec un certificat SSL:

const httpsAgent = new https.Agent({
  rejectUnauthorized: false,
  cert: fs.readFileSync("./usercert.pem"),
  key: fs.readFileSync("./key.pem"),
  passphrase: "YYY"
})

axios.get(url, { httpsAgent })

// or

const instance = axios.create({ httpsAgent })

De https://github.com/axios/axios/issues/284

1
Fabio Espinosa