Połączyłem się z VPN, aby skonfigurować interfejs API inwentaryzacji, aby uzyskać listę produktów i działa dobrze. Gdy otrzymam wynik z usługi internetowej i powiążę się z interfejsem użytkownika. A także zintegrowałem PayPal z moją aplikacją do ekspresowej płatności, kiedy dzwonię do płatności, napotykam ten błąd. Używam serwletu do procesów zaplecza. Czy ktoś może powiedzieć, jak rozwiązać ten problem?
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
Odpowiedzi:
Najpierw musisz uzyskać certyfikat publiczny z serwera, z którym próbujesz się połączyć. Można to zrobić na różne sposoby, na przykład kontaktując się z administratorem serwera i prosząc o to, używając OpenSSL do pobrania lub, ponieważ wygląda na to, że jest to serwer HTTP, łącząc się z nim za pomocą dowolnej przeglądarki, przeglądając informacje o zabezpieczeniach strony i zapisanie kopii certyfikatu. (Google powinien być w stanie powiedzieć dokładnie, co zrobić dla Twojej konkretnej przeglądarki).
Po zapisaniu certyfikatu w pliku należy dodać go do zaufanego magazynu maszyny JVM. W
$JAVA_HOME/jre/lib/security/
przypadku JRE lub$JAVA_HOME/lib/security
JDK znajduje się plik o nazwiecacerts
, który jest dostarczany z Javą i zawiera publiczne certyfikaty dobrze znanych urzędów certyfikacji. Aby zaimportować nowy certyfikat, uruchom keytool jako użytkownik, który ma uprawnienia do zapisu w cacerts:Najprawdopodobniej poprosi Cię o hasło. Domyślne hasło dostarczone z Javą to
changeit
. Prawie nikt tego nie zmienia. Po wykonaniu tych stosunkowo prostych kroków będziesz komunikować się bezpiecznie i mając pewność, że rozmawiasz z właściwym serwerem i tylko z właściwym serwerem (o ile nie stracą klucza prywatnego).źródło
Teraz rozwiązałem ten problem w ten sposób,
Oczywiście to rozwiązanie powinno być stosowane tylko w scenariuszach, w których nie jest możliwe zainstalowanie wymaganych certyfikatów przy użyciu
keytool
np. Testów lokalnych z tymczasowymi certyfikatami.źródło
Ilekroć próbujemy połączyć się z adresem URL,
jeśli serwer w innej witrynie działa na protokole https i nakazuje nam komunikację za pośrednictwem informacji podanych w certyfikacie, mamy następującą opcję:
1) poproś o certyfikat (pobierz certyfikat), zaimportuj ten certyfikat do trustore. Domyślne zastosowania trustore java można znaleźć w \ Java \ jdk1.6.0_29 \ jre \ lib \ security \ cacerts, a jeśli spróbujemy ponownie połączyć się z adresem URL, połączenie zostanie zaakceptowane.
2) W normalnych przypadkach biznesowych możemy łączyć się z wewnętrznymi adresami URL w organizacjach i wiemy, że są one poprawne. W takich przypadkach ufasz, że jest to poprawny adres URL. W takich przypadkach można użyć kodu, który nie upoważnia do przechowywania certyfikatu w celu połączenia się z określonym adresem URL.
dla punktu nr 2 musimy wykonać poniższe kroki:
1) napisz poniżej metodę, która ustawia HostnameVerifier dla HttpsURLConnection, który zwraca wartość true dla wszystkich przypadków, co oznacza, że ufamy trustStore.
2) napisz poniżej metodę, która wywołuje doTrustToCertificates przed próbą połączenia się z adresem URL
To wywołanie zwróci kod odpowiedzi = 200 oznacza, że połączenie się powiodło.
Więcej szczegółów i przykładowy przykład można znaleźć pod adresem URL .
źródło
SSLHandshakeException można rozwiązać na dwa sposoby.
Zawiera SSL
Uzyskaj SSL (pytając administratora systemu źródłowego, można go również pobrać za pomocą polecenia openssl lub dowolnej przeglądarki pobiera certyfikaty)
Dodaj certyfikat do zaufanego magazynu (cacerts) znajdującego się w JRE / lib / security
podaj lokalizację zaufanych certyfikatów w argumentach maszyny wirtualnej jako „-Djavax.net.ssl.trustStore =”
Ignorowanie SSL
W tym punkcie nr 2 odwiedź moją drugą odpowiedź na innej stronie internetowej stackoverflow: Jak przeprowadzić weryfikację SSL Ignoruj błędy certyfikatu SSL w Javie
źródło
Uważam, że próbujesz połączyć się z czymś za pomocą SSL, ale coś dostarcza certyfikat, który nie jest weryfikowany przez główne urzędy certyfikacji, takie jak verisign .. W zasadzie domyślnie bezpieczne połączenia można nawiązać tylko wtedy, gdy osoba próbująca się połączyć wie klucze kontrahentów lub inny dostawca, taki jak verisign, może wkroczyć i powiedzieć, że dostarczony klucz publiczny jest rzeczywiście prawidłowy.
Zaufanie ALL OS garstka urzędów certyfikacji i mniejszych wystawców certyfikatów musi być certyfikowana przez jednego z dużych certyfikatorów tworzących łańcuch certyfikatów, jeśli rozumiesz, o co mi chodzi ...
W każdym razie wracając do rzeczy ... Miałem podobny problem podczas programowania apletu java i serwera java (mam nadzieję, że pewnego dnia napiszę cały wpis na blogu o tym, jak sprawiłem, że wszystkie zabezpieczenia działają :))
W istocie to, co musiałem zrobić, to wyodrębnić klucze publiczne z serwera i przechowywać je w magazynie kluczy wewnątrz mojego apletu, a kiedy połączyłem się z serwerem, użyłem tego magazynu kluczy do stworzenia fabryki zaufania i tej fabryki zaufania do utworzenia ssl połączenie. Istnieją alternatywne procedury, takie jak dodanie klucza do zaufanego hosta maszyny JVM i modyfikowanie domyślnego magazynu zaufanych certyfikatów podczas uruchamiania.
Zrobiłem to około dwa miesiące temu i nie mam teraz przy sobie kodu źródłowego ... użyj google i powinieneś być w stanie rozwiązać ten problem. Jeśli nie możesz wysłać do mnie wiadomości zwrotnej i mogę dostarczyć Ci odpowiedni kod źródłowy projektu .. Nie wiem, czy to rozwiąże problem, ponieważ nie dostarczyłeś kodu, który powoduje te wyjątki. Ponadto pracowałem z apletami i nie rozumiem, dlaczego nie działają na Serverletach ...
PS Nie mogę pobrać kodu źródłowego przed weekendem, ponieważ zewnętrzne SSH jest wyłączone w moim biurze :(
źródło
Teraz rozwiązałem ten problem w ten sposób,
źródło