Ich benutze node.js request.js, um eine API zu erreichen. Ich erhalte diesen Fehler
[Fehler: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
Alle meine Anmeldeinformationen sind korrekt und gültig, und der Server ist in Ordnung. Ich habe die gleiche Anfrage mit dem Postboten gemacht.
request({
"url": domain+"/api/orders/originator/"+id,
"method": "GET",
"headers":{
"X-API-VERSION": 1,
"X-API-KEY": key
},
}, function(err, response, body){
console.log(err);
console.log(response);
console.log(body);
});
Dieser Code wird nur in einem ausführbaren Skript ausgeführt. node ./run_file.js
, Ist das Warum? Muss es auf einem Server ausgeführt werden?
javascript
node.js
ssl
request
ThomasReggi
quelle
quelle
Antworten:
Hinweis : Folgendes ist gefährlich und ermöglicht das Abfangen und Ändern von API-Inhalten zwischen dem Client und dem Server.
Das hat auch funktioniert
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
quelle
nodemailer
undnodemailer-smtp-transport
und der gleiche allgemeine Befehl gearbeitet. Sie müssen dies zu IhremcreateTransport
Objekt hinzufügen :tls:{rejectUnauthorized: false}
Es ist kein Problem mit der Anwendung, sondern mit dem Zertifikat, das von einer zwischengeschalteten Zertifizierungsstelle signiert ist. Wenn Sie diese Tatsache akzeptieren und dennoch fortfahren möchten, fügen Sie Folgendes hinzu, um Optionen anzufordern:
Vollständige Anfrage:
quelle
Die sichere Lösung
Anstatt die Sicherheit zu deaktivieren, können Sie der Kette die erforderlichen Zertifikate hinzufügen. Installieren Sie zuerst das ssl-root-cas- Paket von npm:
Dieses Paket enthält viele Zwischenzertifikate, denen Browser vertrauen, Knoten jedoch nicht.
Fügt die fehlenden Zertifikate hinzu. Weitere Informationen finden Sie hier:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
Siehe auch die nächste Antwort unten
quelle
ca
Array bereitstellen . Ich weiß nicht, ob das http-Modul auch auf die Betriebssystemkette abzielt. Curl unter OS X scheint jedoch nur die OS-Kette zu verwenden und keine manuell angegebenen Zertifikate zuzulassen.Die Lösung von CoolAJ86 ist korrekt und beeinträchtigt Ihre Sicherheit nicht wie das Deaktivieren aller Überprüfungen mit
rejectUnauthorized
oderNODE_TLS_REJECT_UNAUTHORIZED
. Möglicherweise müssen Sie jedoch das Zertifikat einer zusätzlichen Zertifizierungsstelle explizit einfügen.Ich habe zuerst die Root-CAs ausprobiert, die im ssl-root-cas- Modul enthalten sind:
Ich bin immer noch mit dem
UNABLE_TO_VERIFY_LEAF_SIGNATURE
Fehler gelandet. Dann fand ich heraus, wer das Zertifikat für die Website ausgestellt hat, zu der ich vom COMODO SSL Analyzer eine Verbindung hergestellt habe, lud das Zertifikat dieser Behörde herunter und versuchte, nur dieses hinzuzufügen:Am Ende hatte ich einen weiteren Fehler :
CERT_UNTRUSTED
. Schließlich injizierte ich die zusätzlichen Stammzertifizierungsstellen und fügte "meine" (anscheinend zwischengeschaltete) Zertifizierungsstelle hinzu, was funktionierte:quelle
.cer
Lauf erhaltenopenssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt
, konvertieren Sie es.crt
vorherFür Create React App (wo dieser Fehler ebenfalls auftritt und diese Frage das erste Google-Ergebnis ist) verwenden Sie wahrscheinlich
HTTPS=true npm start
einproxy
(inpackage.json
), das zu einer HTTPS-API führt, die selbst in der Entwicklung selbst signiert ist.Wenn dies der Fall ist, sollten Sie Folgendes ändern
proxy
:secure
entscheidet, ob der WebPack-Proxy die Zertifikatkette überprüft oder nicht, und durch Deaktivieren wird sichergestellt, dass das selbstsignierte API-Zertifikat nicht überprüft wird, damit Sie Ihre Daten erhalten.quelle
Es kann sehr verlockend sein, es zu tun
rejectUnauthorized: false
oderprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
aber nicht zu tun! Es setzt Sie Menschen in den mittleren Angriffen aus.Die anderen Antworten sind insofern richtig, als das Problem in der Tatsache liegt, dass Ihr Zertifikat "von einer zwischengeschalteten Zertifizierungsstelle signiert" ist. Hierfür gibt es eine einfache Lösung, für die keine Bibliothek eines Drittanbieters wie das
ssl-root-cas
Einfügen zusätzlicher CAs in den Knoten erforderlich ist .Die meisten https-Clients in Knoten unterstützen Optionen, mit denen Sie pro Anforderung eine Zertifizierungsstelle angeben können, die aufgelöst wird
UNABLE_TO_VERIFY_LEAF_SIGNATURE
. Hier ist ein einfaches Beispiel mit dem integriertenhttps
Modul des Knotens .Wenn Sie jedoch die SSL-Einstellungen auf Ihrem Hosting-Server konfigurieren können, besteht die beste Lösung darin, die Zwischenzertifikate Ihrem Hosting-Anbieter hinzuzufügen. Auf diese Weise muss der Client-Anforderer keine Zertifizierungsstelle angeben, da diese im Server selbst enthalten ist. Ich persönlich benutze namecheap + heroku. Der Trick für mich war, eine CRT-Datei mit zu erstellen
cat yourcertificate.crt bundle.ca-bundle > server.crt
. Ich habe diese Datei dann geöffnet und nach dem ersten Zertifikat eine neue Zeile hinzugefügt. Sie können mehr unter lesenhttps://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl
quelle
Nur hier für den Fall, dass es jemandem hilft, mein Fall war anders und ein bisschen seltsam. Ich erhielt dies auf eine Anfrage, auf die über Superagent zugegriffen wurde - das Problem hatte nichts mit Zertifikaten zu tun (die ordnungsgemäß eingerichtet wurden) und alles damit, dass ich das Superagent-Ergebnis dann über den Wasserfall-Rückruf des Async- Moduls weiterleitete. So beheben Sie das Problem: Anstatt das gesamte Ergebnis zu übergeben,
result.body
durchlaufen Sie einfach den Rückruf des Wasserfalls.quelle
Ich hatte die gleichen Probleme. Ich habe die Lösungen @ThomasReggi und @ CoolAJ86 befolgt und gut gearbeitet, bin aber mit der Lösung nicht zufrieden.
Da das Problem "UNABLE_TO_VERIFY_LEAF_SIGNATURE" aufgrund der Konfigurationsstufe der Zertifizierung aufgetreten ist.
Ich nehme @thirdender Lösung , aber seinen Teil solution.As pro der nginx offiziellen Website, sie klar genanntes Zertifikat soll Kombination des Server - Zertifikats und verketteten Zertifikate sein.
quelle
Sie können auch durch das Setzen versuchen strictSSL zu
false
, wie folgt aus :quelle
Ich hatte ein Problem mit meiner Apache-Konfiguration, nachdem ich ein GoDaddy-Zertifikat in einer Subdomain installiert hatte. Ich dachte ursprünglich, es könnte ein Problem sein, wenn Node keinen Server Name Indicator (SNI) sendet, aber das war nicht der Fall. Das Analysieren des SSL-Zertifikats der Subdomain mit https://www.ssllabs.com/ssltest/ ergab den Fehler. Kettenprobleme: Unvollständig .
Nach dem Hinzufügen der von GoDaddy bereitgestellten
gd_bundle-g2-g1.crt
Datei über dieSSLCertificateChainFile
Apache-Direktive konnte Node eine Verbindung über HTTPS herstellen, und der Fehler wurde behoben.quelle
Sie müssen das Zwischenzertifikat in Ihren Server aufnehmen. Dies löst den [Fehler: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
quelle
Ein anderer Ansatz zur sicheren Lösung besteht darin, das folgende Modul zu verwenden.
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
Wenn Sie zu diesem Thread kommen, weil Sie das Modul postgres / pg des Knotens verwenden, gibt es eine bessere Lösung als das Festlegen von
NODE_TLS_REJECT_UNAUTHORIZED
oderrejectUnauthorized
, was zu unsicheren Verbindungen führt.Konfigurieren Sie stattdessen die Option "ssl" so, dass sie mit den Parametern für tls.connect übereinstimmt :
Ich habe ein Modul Hilfe geschrieben mit wie diese Optionen von Umgebungsvariablen Parsen
PGSSLROOTCERT
,PGSSLCERT
undPGSSLKEY
:https://github.com/programmarchy/pg-ssl
quelle
Folgende Befehle haben bei mir funktioniert:
Das Problem besteht darin, dass Sie versuchen, ein Modul aus einem Repository mit einem fehlerhaften oder nicht vertrauenswürdigen SSL-Zertifikat (Secure Sockets Layer) zu installieren. Sobald Sie den Cache bereinigt haben, ist dieses Problem behoben. Möglicherweise müssen Sie ihn später auf true setzen.
quelle