Aby dotrzeć do interfejsu API, używam node.js request.js. Otrzymuję ten błąd
[Błąd: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
Wszystkie moje dane uwierzytelniające są dokładne i ważne, a serwer działa prawidłowo. Złożyłem tę samą prośbę z listonoszem.
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);
});
Ten kod działa po prostu w wykonywalnym skrypcie, np. node ./run_file.js
, Czy to dlatego? Czy musi działać na serwerze?
javascript
node.js
ssl
request
ThomasReggi
źródło
źródło
Odpowiedzi:
Uwaga : poniższe czynności są niebezpieczne i pozwolą na przechwytywanie i modyfikowanie zawartości API między klientem a serwerem.
To też zadziałało
process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
źródło
nodemailer
inodemailer-smtp-transport
to samo polecenie ogóle pracował. Musisz dodać to do swojegocreateTransport
obiektu:tls:{rejectUnauthorized: false}
To nie jest problem z aplikacją, ale z certyfikatem podpisanym przez pośredniczący CA. Jeśli akceptujesz ten fakt i nadal chcesz kontynuować, dodaj następujące informacje, aby poprosić o opcje:
Pełne żądanie:
źródło
Bezpieczne rozwiązanie
Zamiast wyłączać zabezpieczenia, możesz dodać niezbędne certyfikaty do łańcucha. Najpierw zainstaluj pakiet ssl-root-cas z npm:
Ten pakiet zawiera wiele certyfikatów pośredniczących, którym przeglądarki ufają, ale węzeł nie.
Doda brakujące certyfikaty. Zobacz tutaj, aby uzyskać więcej informacji:
https://git.coolaj86.com/coolaj86/ssl-root-cas.js
Zobacz także następną odpowiedź poniżej
źródło
ca
tablicę. Nie wiem, czy jego moduł http będzie również wyglądał na łańcuch systemu operacyjnego. Jednak funkcja curl w systemie OS X wydaje się używać tylko łańcucha systemu operacyjnego i nie zezwala na ręcznie określane certyfikaty.Rozwiązanie CoolAJ86 jest poprawne i nie zagraża bezpieczeństwu, jak wyłączenie wszystkich kontroli za pomocą
rejectUnauthorized
lubNODE_TLS_REJECT_UNAUTHORIZED
. Mimo to może być konieczne jawne wstrzyknięcie dodatkowego certyfikatu CA.Najpierw wypróbowałem główne urzędy certyfikacji zawarte w module ssl-root-cas :
Nadal skończyłem z
UNABLE_TO_VERIFY_LEAF_SIGNATURE
błędem. Następnie dowiedziałem się, kto wystawił certyfikat dla strony internetowej, z którą łączyłem się przez COMODO SSL Analyzer , pobrałem certyfikat tego urzędu i próbowałem dodać tylko ten:Skończyło się z innym błędem:
CERT_UNTRUSTED
. Na koniec wstrzyknąłem dodatkowe główne CA i dołączyłem „mój” (najwyraźniej pośredni) CA, który działał:źródło
.cer
uruchom to,openssl x509 -inform DER -in YOUR_CERTIFICATE.cer -out YOUR_CERTIFICATE.crt
aby przekonwertować go.crt
wcześniejW przypadku aplikacji Create React (gdzie ten błąd również występuje, a to pytanie jest wynikiem nr 1 w Google), prawdopodobnie używasz
HTTPS=true npm start
iproxy
(inpackage.json
), które przechodzi do jakiegoś interfejsu API HTTPS, który sam się podpisuje, podczas opracowywania.W takim przypadku rozważ zmianę w
proxy
ten sposób:secure
decyduje, czy serwer proxy WebPack sprawdza łańcuch certyfikatów, czy też nie, i wyłączanie, które zapewnia, że certyfikat z podpisem własnym interfejsu API nie jest weryfikowany, aby uzyskać dane.źródło
To może być bardzo kuszące, aby zrobić
rejectUnauthorized: false
alboprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';
ale nie rób tego! Naraża cię na ataki man in the middle.Inne odpowiedzi są poprawne, ponieważ problem polega na tym, że Twój certyfikat jest „podpisany przez pośredniczący CA”. Istnieje na to proste rozwiązanie, które nie wymaga biblioteki innej firmy, takiej jak np.
ssl-root-cas
Wstawianie dodatkowych urzędów certyfikacji do węzła.Większość klientów https w opcjach obsługi węzłów, które pozwalają określić CA na żądanie, które zostaną rozwiązane
UNABLE_TO_VERIFY_LEAF_SIGNATURE
. Oto prosty przykład użycia wbudowanegohttps
modułu node .Jeśli jednak możesz skonfigurować ustawienia SSL na serwerze hostingowym, najlepszym rozwiązaniem byłoby dodanie certyfikatów pośrednich do dostawcy hostingu. W ten sposób requester klienta nie musi określać urzędu certyfikacji, ponieważ jest on zawarty w samym serwerze. Osobiście używam namecheap + heroku. Sztuczka polegała na utworzeniu jednego pliku .crt z rozszerzeniem
cat yourcertificate.crt bundle.ca-bundle > server.crt
. Następnie otworzyłem ten plik i dodałem nową linię po pierwszym certyfikacie. Możesz przeczytać więcej nahttps://www.namecheap.com/support/knowledgebase/article.aspx/10050/33/installing-an-ssl-certificate-on-heroku-ssl
źródło
Umieszczając to tutaj na wypadek, gdyby to komuś pomogło, mój przypadek był inny i trochę dziwny. Otrzymywałem to na żądanie, do którego uzyskano dostęp za pośrednictwem superagenta - problem nie miał nic wspólnego z certyfikatami (które zostały prawidłowo skonfigurowane), a wszystko z faktem, że następnie przekazywałem wynik superagenta przez wywołanie zwrotne kaskady modułu asynchronicznego . Aby naprawić: zamiast przekazywać cały wynik, po prostu przejdź
result.body
przez wywołanie zwrotne wodospadu.źródło
Miałem te same problemy. Śledziłem rozwiązanie @ThomasReggi i @ CoolAJ86 i działałem dobrze, ale nie jestem zadowolony z rozwiązania.
Ponieważ problem „UNABLE_TO_VERIFY_LEAF_SIGNATURE” występuje z powodu poziomu konfiguracji certyfikacji.
Akceptuję rozwiązanie @thirdender, ale jego częściowe rozwiązanie.Zgodnie z oficjalną witryną nginx , wyraźnie wspomniano, że certyfikat powinien być połączeniem certyfikatu serwera i powiązanych certyfikatów.
źródło
Możesz także spróbować, ustawiając parametr strictSSL na
false
, na przykład:źródło
Po zainstalowaniu certyfikatu GoDaddy na subdomenie wystąpił problem z konfiguracją Apache. Początkowo myślałem, że może to być problem z tym, że Node nie wysyła wskaźnika nazwy serwera (SNI), ale tak nie było. Analiza certyfikatu SSL subdomeny za pomocą https://www.ssllabs.com/ssltest/ zwróciła błąd Problemy z łańcuchem: niekompletne .
Po dodaniu
gd_bundle-g2-g1.crt
pliku dostarczonego przez GoDaddy za pośrednictwemSSLCertificateChainFile
dyrektywy Apache, Node był w stanie połączyć się przez HTTPS i błąd zniknął.źródło
Musisz dołączyć certyfikat pośredni na swoim serwerze. To rozwiązuje [Błąd: UNABLE_TO_VERIFY_LEAF_SIGNATURE]
źródło
Innym podejściem do bezpiecznego rozwiązania tego problemu jest użycie następującego modułu.
node_extra_ca_certs_mozilla_bundle
Moduł ten może działać bez modyfikacji kodu, generując plik PEM zawierający wszystkie certyfikaty główne i pośrednie zaufane przez Mozillę. Możesz użyć następującej zmiennej środowiskowej (działa z Nodejs v7.3 +),
NODE_EXTRA_CA_CERTS
Aby wygenerować plik PEM do użycia z powyższą zmienną środowiskową. Moduł możesz zainstalować za pomocą:
a następnie uruchom skrypt węzła ze zmienną środowiskową.
Inne sposoby wykorzystania wygenerowanego pliku PEM są dostępne pod adresem:
https://github.com/arvind-agarwal/node_extra_ca_certs_mozilla_bundle
UWAGA: jestem autorem powyższego modułu.
źródło
Jeśli trafisz do tego wątku, ponieważ używasz modułu node postgres / pg, istnieje lepsze rozwiązanie niż ustawienie
NODE_TLS_REJECT_UNAUTHORIZED
lubrejectUnauthorized
, które doprowadzi do niezabezpieczonych połączeń.Zamiast tego skonfiguruj opcję „ssl” tak, aby odpowiadała parametrom tls.connect :
Pisałem moduł do pomocy z tych opcji z parsowania zmiennych środowiskowych, jak
PGSSLROOTCERT
,PGSSLCERT
orazPGSSLKEY
:https://github.com/programmarchy/pg-ssl
źródło
Działały dla mnie następujące polecenia:
Problem polega na tym, że próbujesz zainstalować moduł z repozytorium ze złym lub niezaufanym certyfikatem SSL [Secure Sockets Layer]. Po wyczyszczeniu pamięci podręcznej problem zostanie rozwiązany i może być konieczne późniejsze przywrócenie tego stanu.
źródło