unable to verify the first certificate
La chaîne de certificats est incomplète.
Cela signifie que le serveur Web auquel vous vous connectez est mal configuré et n'inclut pas le certificat intermédiaire dans la chaîne de certificats qu'il vous a envoyé.
Chaîne de certificats
Cela ressemble très probablement à ceci:
- Certificat de serveur - stocke un certificat signé par l'intermédiaire.
- Certificat intermédiaire - stocke un certificat signé par root.
- Certificat racine - stocke un certificat auto-signé.
Le certificat intermédiaire doit être installé sur le serveur, avec le certificat du serveur.
Les certificats racines sont intégrés aux applications logicielles, aux navigateurs et aux systèmes d'exploitation.
L'application servant le certificat doit envoyer la chaîne complète, c'est-à-dire le certificat du serveur lui-même et tous les intermédiaires. Le certificat racine est censé être connu du client.
Recréez le problème
Accédez à https://incomplete-chain.badssl.com en utilisant votre navigateur.
Il ne montre aucune erreur (le cadenas dans la barre d'adresse est vert).
C'est parce que les navigateurs ont tendance à compléter la chaîne si elle n'est pas envoyée depuis le serveur.
Maintenant, connectez-vous à https://incomplete-chain.badssl.com en utilisant Node:
// index.js
const axios = require('axios');
axios.get('https://incomplete-chain.badssl.com')
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Journaux: " Erreur: impossible de vérifier le premier certificat ".
Solution
Vous devez compléter la chaîne de certificats vous-même.
Pour faire ça:
1: Vous devez obtenir le certificat intermédiaire manquant au .pem
format, puis
2a: étendre le magasin de certificats intégré de Node en utilisant NODE_EXTRA_CA_CERTS
,
2b: ou passez votre propre bundle de certificats (intermédiaires et racine) en utilisant l' ca
option.
1. Comment obtenir un certificat intermédiaire?
Utilisation de openssl
(livré avec Git pour Windows ).
Enregistrez les détails du certificat du serveur distant:
openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile
Nous recherchons l'émetteur (le certificat intermédiaire est l'émetteur / signataire du certificat serveur):
openssl x509 -in logcertfile -noout -text | grep -i "issuer"
Il devrait vous donner l'URI du certificat de signature. Télécharge le:
curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
Enfin, convertissez-le en .pem
:
openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text
2a. NODE_EXTRA_CERTS
J'utilise cross-env pour définir les variables d'environnement dans le package.json
fichier:
"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"
2b. ca
option
Cette option va écraser les autorités de certification racine intégrées du nœud.
C'est pourquoi nous devons créer notre propre autorité de certification racine. Utilisez ssl-root-cas .
Ensuite, créez un https
agent personnalisé configuré avec notre bundle de certificats (racine et intermédiaire). Transmettez cet agent à axios
lors de la demande.
// index.js
const axios = require('axios');
const path = require('path');
const https = require('https');
const rootCas = require('ssl-root-cas').create();
rootCas.addFile(path.resolve(__dirname, 'intermediate.pem'));
const httpsAgent = new https.Agent({ca: rootCas});
axios.get('https://incomplete-chain.badssl.com', { httpsAgent })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);
});
Au lieu de créer un https
agent personnalisé et de le transmettre à axios
, vous pouvez placer les certifcats sur l' https
agent global:
// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;
Ressources:
- https://levelup.gitconnected.com/how-to-resolve-certificate-errors-in-nodejs-app-involving-ssl-calls-781ce48daded
- https://www.npmjs.com/package/ssl-root-cas
- https://github.com/nodejs/node/issues/16336
- https://www.namecheap.com/support/knowledgebase/article.aspx/9605/69/how-to-check-ca-chain-installation
- /superuser/97201/how-to-save-a-remote-server-ssl-certificate-locally-as-a-file/
- Comment convertir .crt en .pem