unable to verify the first certificate
Die Zertifikatskette ist unvollständig.
Dies bedeutet, dass der Webserver, mit dem Sie eine Verbindung herstellen, falsch konfiguriert ist und das Zwischenzertifikat nicht in die an Sie gesendete Zertifikatkette aufgenommen hat.
Zertifikatskette
Es sieht höchstwahrscheinlich wie folgt aus:
- Serverzertifikat - Speichert ein von einem Zwischenprodukt signiertes Zertifikat.
- Zwischenzertifikat - Speichert ein von root signiertes Zertifikat.
- Stammzertifikat - speichert ein selbstsigniertes Zertifikat.
Das Zwischenzertifikat sollte zusammen mit dem Serverzertifikat auf dem Server installiert sein.
Stammzertifikate sind in Softwareanwendungen, Browser und Betriebssysteme eingebettet.
Die Anwendung, die das Zertifikat bereitstellt, muss die gesamte Kette senden, dh das Serverzertifikat selbst und alle Zwischenprodukte. Das Stammzertifikat soll dem Client bekannt sein.
Erstellen Sie das Problem neu
Gehen Sie mit Ihrem Browser zu https://incomplete-chain.badssl.com .
Es wird kein Fehler angezeigt (Vorhängeschloss in der Adressleiste ist grün).
Dies liegt daran, dass Browser dazu neigen, die Kette zu vervollständigen, wenn sie nicht vom Server gesendet werden.
Stellen Sie nun über den Knoten eine Verbindung zu https://incomplete-chain.badssl.com her :
// 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);
});
Protokolle: " Fehler: Das erste Zertifikat kann nicht überprüft werden ".
Lösung
Sie müssen die Zertifikatskette selbst ausfüllen.
Das zu tun:
1:.pem
Dann müssen Sie das fehlende Zwischenzertifikat im Format erhalten
2a: Erweitern Sie den integrierten Zertifikatspeicher des Knotens mit NODE_EXTRA_CA_CERTS
:
2b: oder übergeben Sie Ihr eigenes Zertifikatspaket (Zwischenprodukte und Root) mit der ca
Option.
1. Wie bekomme ich ein Zwischenzertifikat?
Verwenden openssl
(wird mit Git für Windows geliefert ).
Speichern Sie die Zertifikatdetails des Remote-Servers:
openssl s_client -connect incomplete-chain.badssl.com:443 -servername incomplete-chain.badssl.com | tee logcertfile
Wir suchen den Aussteller (das Zwischenzertifikat ist der Aussteller / Unterzeichner des Serverzertifikats):
openssl x509 -in logcertfile -noout -text | grep -i "issuer"
Es sollte Ihnen die URI des Signaturzertifikats geben. Lade es herunter:
curl --output intermediate.crt http://cacerts.digicert.com/DigiCertSHA2SecureServerCA.crt
Konvertieren Sie es schließlich in .pem
:
openssl x509 -inform DER -in intermediate.crt -out intermediate.pem -text
2a. NODE_EXTRA_CERTS
Ich verwende cross-env , um Umgebungsvariablen in der package.json
Datei festzulegen:
"start": "cross-env NODE_EXTRA_CA_CERTS=\"C:\\Users\\USERNAME\\Desktop\\ssl-connect\\intermediate.pem\" node index.js"
2b. ca
Möglichkeit
Diese Option überschreibt die integrierten Stammzertifizierungsstellen des Knotens.
Deshalb müssen wir unsere eigene Stammzertifizierungsstelle erstellen. Verwenden Sie ssl-root-cas .
Erstellen Sie dann einen benutzerdefinierten https
Agenten, der mit unserem Zertifikatspaket (Root und Intermediate) konfiguriert ist. Übergeben Sie diesen Agenten an, axios
wenn Sie eine Anfrage stellen.
// 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);
});
Anstatt einen benutzerdefinierten https
Agenten zu erstellen und an diesen zu übergeben axios
, können Sie die Zertifikate auf dem https
globalen Agenten platzieren:
// Applies to ALL requests (whether using https directly or the request module)
https.globalAgent.options.ca = rootCas;
Ressourcen:
- 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/
- So konvertieren Sie .crt in .pem