Ich versuche, eine Datei mithilfe einer URL vom Jira-Server herunterzuladen, erhalte jedoch eine Fehlermeldung. So fügen Sie ein Zertifikat in den Code ein, um den Fehler zu überprüfen :
Error: unable to verify the first certificate in nodejs
at Error (native)
at TLSSocket.<anonymous> (_tls_wrap.js:929:36)
at TLSSocket.emit (events.js:104:17)
at TLSSocket._finishInit (_tls_wrap.js:460:8)
Mein Nodejs-Code:
var https = require("https");
var fs = require('fs');
var options = {
host: 'jira.example.com',
path: '/secure/attachment/206906/update.xlsx'
};
https.get(options, function (http_res) {
var data = "";
http_res.on("data", function (chunk) {
data += chunk;
});
http_res.on("end", function () {
var file = fs.createWriteStream("file.xlsx");
data.pipe(file);
});
});
node.js
ssl-certificate
jira
Labeo
quelle
quelle
Antworten:
Versuchen Sie, das entsprechende Stammzertifikat hinzuzufügen
Dies wird immer eine viel sicherere Option sein, als nicht autorisierte Endpunkte blind zu akzeptieren, was wiederum nur als letztes Mittel verwendet werden sollte.
Dies kann so einfach wie das Hinzufügen sein
zu Ihrer Bewerbung.
Das npm-Paket der SSL-Stammzertifizierungsstellen (wie hier verwendet) ist ein sehr nützliches Paket in Bezug auf dieses Problem.
quelle
$(mkcert -CAROOT)/rootCA.pem
in einer neuen Zertifikatdatei verfügbar ist, und so etwas wiehttps.globalAgent.options.ca = fs.readFileSync('fullchain.pem')
Siehe github.com/FiloSottile/mkcert/issues/76ssl-root-cas
npm-Modul eine Anfrage an mozilla.org hardcoded git.coolaj86.com/coolaj86/ssl-root-cas.js/src/branch/master/… . Es ist wahrscheinlich sicher, weil Mozilla, aber es scheint wie ein Angriffsvektor.Ein weiterer schmutziger Hack, der alle Ihre Anfragen unsicher macht:
quelle
Wenn das erste Zertifikat in nodejs nicht überprüft werden kann, ist eine nicht autorisierte Ablehnung erforderlich
quelle
Der Server, von dem Sie herunterladen möchten, ist möglicherweise schlecht konfiguriert. Selbst wenn es in Ihrem Browser funktioniert, enthält es möglicherweise nicht alle öffentlichen Zertifikate in der Kette, die ein Client mit leerem Cache zur Überprüfung benötigt.
Ich empfehle, die Website im SSLlabs-Tool zu überprüfen: https://www.ssllabs.com/ssltest/
Suchen Sie nach diesem Fehler:
Und das:
quelle
cat domainname.crt domainname.ca-bundle > domainname-ssl-bundle.crt
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:
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 :
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 erhalten2a: 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:
Wir suchen den Aussteller (das Zwischenzertifikat ist der Aussteller / Unterzeichner des Serverzertifikats):
Es sollte Ihnen die URI des Signaturzertifikats geben. Lade es herunter:
Konvertieren Sie es schließlich in
.pem
:2a. NODE_EXTRA_CERTS
Ich verwende cross-env , um Umgebungsvariablen in der
package.json
Datei festzulegen:2b.
ca
MöglichkeitDiese 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.Anstatt einen benutzerdefinierten
https
Agenten zu erstellen und an diesen zu übergebenaxios
, können Sie die Zertifikate auf demhttps
globalen Agenten platzieren:Ressourcen:
quelle
Dies löste es tatsächlich für mich unter https://www.npmjs.com/package/ssl-root-cas
quelle
Möglicherweise können Sie dies tun, indem Sie die Anforderungsoptionen wie folgt ändern. Wenn Sie ein selbstsigniertes Zertifikat oder einen fehlenden Vermittler verwenden, wird durch das Setzen von strictSSL auf false das Anforderungspaket nicht zur Validierung des Zertifikats gezwungen.
quelle
GoDaddy SSL CCertificate
Ich habe dies erlebt, als ich versucht habe, mit dem GoDaddy-Zertifikat eine Verbindung zu unserem Backend-API-Server herzustellen. Hier ist der Code, mit dem ich das Problem gelöst habe.
PS:
Verwenden Sie das mitgelieferte Zertifikat und vergessen Sie nicht, die Bibliothek zu installieren
npm install ssl-root-cas
quelle
Dies funktionierte für mich => Hinzufügen eines Agenten und 'RejectUnauthorized' auf false gesetzt
quelle
Ein anderer Ansatz, um dies zu lösen, ist die Verwendung des folgenden Moduls.
node_extra_ca_certs_mozilla_bundle
Dieses Modul kann ohne Codeänderung arbeiten, indem eine PEM-Datei generiert wird, die alle von Mozilla vertrauenswürdigen Stamm- und Zwischenzertifikate enthält. Sie können die folgende Umgebungsvariable verwenden (funktioniert mit Nodejs v7.3 +):
NODE_EXTRA_CA_CERTS
So generieren Sie die PEM-Datei zur Verwendung mit der obigen Umgebungsvariablen. Sie können das Modul installieren mit:
Starten Sie dann Ihr Knotenskript mit einer Umgebungsvariablen.
Weitere Möglichkeiten zur Verwendung der generierten PEM-Datei finden Sie unter:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
HINWEIS: Ich bin der Autor des obigen Moduls.
quelle
Ich habe das Nodemailer npm-Modul verwendet. Der folgende Code hat das Problem behoben
quelle