unable to verify the first certificate
La catena di certificati è incompleta.
Significa che il server web a cui ci si sta connettendo non è configurato correttamente e non ha incluso il certificato intermedio nella catena di certificati che ti è stato inviato.
Catena di certificati
Molto probabilmente appare come segue:
- Certificato server: memorizza un certificato firmato da intermedio.
- Certificato intermedio: memorizza un certificato firmato da root.
- Certificato radice: memorizza un certificato autofirmato.
Il certificato intermedio deve essere installato sul server, insieme al certificato del server.
I certificati di root sono integrati nelle applicazioni software, nei browser e nei sistemi operativi.
L'applicazione che serve il certificato deve inviare la catena completa, ciò significa che il certificato del server stesso e tutti gli intermedi. Il certificato radice dovrebbe essere conosciuto dal client.
Ricrea il problema
Vai su https://incomplete-chain.badssl.com usando il tuo browser.
Non mostra alcun errore (il lucchetto nella barra degli indirizzi è verde).
È perché i browser tendono a completare la catena se non viene inviato dal server.
Ora connettiti a https://incomplete-chain.badssl.com usando 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);
});
Registri: " Errore: impossibile verificare il primo certificato ".
Soluzione
Devi completare tu stesso la catena di certificati.
Fare quello:
1: È necessario ottenere il certificato intermedio mancante in .pem
formato, quindi
2a: estendi l'archivio certificati incorporato di Node usando NODE_EXTRA_CA_CERTS
,
2b: oppure passare il proprio pacchetto di certificati (intermedi e root) utilizzando l' ca
opzione.
1. Come posso ottenere un certificato intermedio?
Utilizzo openssl
(viene fornito con Git per Windows ).
Salvare i dettagli del certificato del server remoto:
openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile
Stiamo cercando l'emittente (il certificato intermedio è l'emittente / firmatario del certificato del server):
openssl x509 -in logcertfile -noout -text | grep -i "issuer"
Dovrebbe fornirti l'URI del certificato di firma. Scaricalo:
curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
Infine, convertilo in .pem
:
openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text
2a. NODE_EXTRA_CERTS
Sto usando cross-env per impostare le variabili di ambiente nel package.json
file:
"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"
2b. ca
opzione
Questa opzione sovrascriverà le CA root incorporate del nodo.
Ecco perché dobbiamo creare la nostra CA principale. Usa ssl-root-cas .
Quindi, crea un https
agente personalizzato configurato con il nostro pacchetto di certificati (root e intermedio). Passare questo agente a axios
quando si effettua la richiesta.
// 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);
});
Invece di creare un https
agente personalizzato e passarlo a axios
, è possibile posizionare i certificati sull'agente https
globale:
// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;
risorse:
- 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/
- Come convertire .crt in .pem