web-dev-qa-db-de.com

Die Blattsignatur kann nicht überprüft werden

Ich verwende 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 das auch beim Postboten beantragt.

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 läuft gerade in einem ausführbaren Skript ab. node ./run_file.js, Ist das Warum? Muss es auf einem Server laufen?

113
ThomasReggi

Hinweis: Folgendes ist gefährlich und ermöglicht das Abfangen und Ändern von API-Inhalten zwischen dem Client und dem Server.

Das hat auch geklappt

process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';

130
ThomasReggi

Es ist kein Problem mit der Anwendung, sondern mit dem Zertifikat, das von einer zwischengeschalteten Zertifizierungsstelle signiert wurde. Wenn Sie diese Tatsache akzeptieren und dennoch fortfahren möchten, fügen Sie Folgendes hinzu, um Optionen anzufordern:

rejectUnauthorized: false

Vollständige Anfrage:

request({
    "rejectUnauthorized": false,
    "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);
});
83

Die sichere Lösung

Anstatt die Sicherheit zu deaktivieren, können Sie der Kette die erforderlichen Zertifikate hinzufügen. Zuerst installiere ssl-root-cas Paket von npm:

npm install ssl-root-cas

Dieses Paket enthält viele Zwischenzertifikate, denen Browser vertrauen, Knoten jedoch nicht.

var sslRootCAs = require('ssl-root-cas/latest')
sslRootCAs.inject()

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

70
CoolAJ86

Die CoolAJ86-Lösung ist korrekt und beeinträchtigt nicht Ihre Sicherheit, beispielsweise das Deaktivieren aller Überprüfungen mit rejectUnauthorized oder NODE_TLS_REJECT_UNAUTHORIZED. Möglicherweise müssen Sie jedoch das Zertifikat einer zusätzlichen Zertifizierungsstelle explizit einfügen.

Ich habe zuerst die Stammzertifizierungsstellen ausprobiert, die im Modul ssl-root-cas enthalten sind:

require('ssl-root-cas/latest')
  .inject();

Ich hatte immer noch den Fehler UNABLE_TO_VERIFY_LEAF_SIGNATURE. Dann fand ich heraus, wer das Zertifikat für die Website ausgestellt hatte, zu der ich mich mit dem COMODO SSL Analyzer verbunden hatte, lud das Zertifikat dieser Behörde herunter und versuchte, nur diese einzufügen:

require('ssl-root-cas/latest')
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');

Es ist ein weiterer Fehler aufgetreten: CERT_UNTRUSTED. Schließlich injizierte ich die zusätzlichen Stammzertifizierungsstellen und schloss "meine" (anscheinend vermittelnde) Zertifizierungsstelle ein, was funktionierte:

require('ssl-root-cas/latest')
  .inject()
  .addFile(__dirname + '/comodohigh-assurancesecureserverca.crt');
42

Für Create React App (wo auch dieser Fehler auftritt und diese Frage das erste Google-Ergebnis ist) verwenden Sie wahrscheinlich HTTPS=true npm start und ein proxy (in package.json), der auf eine HTTPS-API zugreift, die selbst signiert ist, wenn sie sich in der Entwicklung befindet.

Wenn dies der Fall ist, können Sie proxy folgendermaßen ändern:

"proxy": {
  "/api": {
    "target": "https://localhost:5001",
    "secure": false
  }
}

secure entscheidet, ob der WebPack-Proxy die Zertifikatskette überprüft oder nicht, und deaktiviert, um sicherzustellen, dass das selbstsignierte API-Zertifikat nicht überprüft wird, damit Sie Ihre Daten erhalten.

3

Das hier nur für den Fall, dass es jemandem hilft. Mein Fall war anders und eine seltsame Mischung. Ich erhielt dies auf eine Anfrage, auf die über superagent zugegriffen wurde - das Problem hatte nichts mit Zertifikaten zu tun (die richtig eingerichtet waren) und alles damit, dass ich das Superagent-Ergebnis durchlief Der Wasserfall-Rückruf des async Moduls. Behebung: Anstatt das gesamte Ergebnis zu übergeben, übergeben Sie einfach result.body durch den Rückruf des Wasserfalls.

2
k00k

Ich hatte die gleichen Probleme. Ich bin @ThomasReggi und @ CoolAJ86 gefolgt und habe gut funktioniert, bin aber mit der Lösung nicht zufrieden.

Das Problem "UNABLE_TO_VERIFY_LEAF_SIGNATURE" ist auf die Zertifizierungskonfigurationsebene zurückzuführen.

Ich akzeptiere @ thirdender-Lösung, aber seine Teillösung. Gemäß der offiziellen Website nginx sollte das erwähnte Zertifikat eine Kombination aus Serverzertifikat und verketteten Zertifikaten sein.

enter image description here

2
Sharathi RB

Sie müssen das Zwischenzertifikat in Ihren Server einbinden. Dies löst den [Fehler: UNABLE_TO_VERIFY_LEAF_SIGNATURE]

0
user8797752

Setzen Sie rejectUnauthorized: false in die Petition ein, und das hat bei mir funktioniert.

0
Amn

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 mit Node kein Server Name Indicator (SNI) senden, aber das war nicht der Fall. Analyse des SSL-Zertifikats der Subdomain mit https://www.ssllabs.com/ssltest/ hat den Fehler zurückgegeben. Kettenprobleme: Unvollständig .

Nach dem Hinzufügen des GoDaddy bereitgestellt Gd_bundle-g2-g1.crt -Datei über die Apache-Direktive SSLCertificateChainFile, Node konnte über HTTPS eine Verbindung herstellen, und der Fehler wurde behoben.

0
thirdender