Edycja: - Próbowałem sformatować pytanie i zaakceptowałem odpowiedź w bardziej reprezentatywny sposób na moim blogu
Oto oryginalny numer.
Otrzymuję ten błąd:
szczegółowy komunikat sun.security.validator.ValidatorException: Kompilacja ścieżki PKIX nie powiodła się:
sun.security.provider.certpath.SunCertPathBuilderException: nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celupowoduje javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: nie powiodło się budowanie ścieżki PKIX: sun.security.provider.certpath.SunCertPathBuilderException: nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celu
Używam Tomcat 6 jako serwera WWW. Mam dwie aplikacje internetowe HTTPS zainstalowane na różnych Tomcats na różnych portach, ale na tym samym komputerze. Powiedz App1(port 8443)
i
App2(port 443)
. App1
łączy się z App2
. Po App1
nawiązaniu połączenia App2
otrzymuję powyższy błąd. Wiem, że jest to bardzo częsty błąd, więc natknąłem się na wiele rozwiązań na różnych forach i stronach. Mam poniższy wpis w server.xml
obu Tomcats:
keystoreFile="c:/.keystore"
keystorePass="changeit"
Każda witryna podaje ten sam powód, dla którego certyfikat podany przez app2 nie znajduje się w zaufanym magazynie jvm app1. Wydaje się, że tak jest również wtedy, gdy próbowałem trafić w ten sam adres URL w przeglądarce IE, działa (działa z ociepleniem, jest problem z certyfikatem bezpieczeństwa tej strony. Tutaj mówię, kontynuuj na tej stronie). Ale kiedy klient Java uderza w ten sam adres URL (w moim przypadku), pojawia się powyższy błąd. Aby umieścić go w magazynie zaufania, wypróbowałem trzy opcje:
Opcja 1
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore");
System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
Opcja 2 Ustawienie poniżej w zmiennej środowiskowej
CATALINA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Opcja 3 Ustawienie poniżej w zmiennej środowiskowej
JAVA_OPTS -- param name
-Djavax.net.ssl.trustStore=C:\.keystore -Djavax.net.ssl.trustStorePassword=changeit ---param value
Ale nic nie działało .
Co w końcu działało, stosując podejście Java sugerowane w Jak obsługiwać nieprawidłowe certyfikaty SSL za pomocą Apache HttpClient? przez Pascal Thivent, tj. wykonując program InstallCert.
Ale takie podejście jest dobre dla konfiguracji devboksa, ale nie mogę go używać w środowisku produkcyjnym.
Zastanawiam się dlaczego trzema podejściami wymienionymi powyżej nie działa, gdy wspomniałem te same wartości server.xml
od app2
wartości serwerowych i samych w truststore przez ustawienie
System.setProperty("javax.net.ssl.trustStore", "C:/.keystore") and System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
w app1
programie.
Aby uzyskać więcej informacji, w ten sposób nawiązuję połączenie:
URL url = new URL(urlStr);
URLConnection conn = url.openConnection();
if (conn instanceof HttpsURLConnection) {
HttpsURLConnection conn1 = (HttpsURLConnection) url.openConnection();
conn1.setHostnameVerifier(new HostnameVerifier() {
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
reply.load(conn1.getInputStream());
domainname
serwerów RHEL problem zniknął. Mam nadzieję, że to komuś pomoże.Odpowiedzi:
Musisz dodać certyfikat dla App2 do pliku zaufanych certyfikatów używanej maszyny JVM znajdującej się pod adresem
%JAVA_HOME%\lib\security\cacerts
.Najpierw możesz sprawdzić, czy certyfikat znajduje się już w magazynie zaufania, uruchamiając następującą komendę:
keytool -list -keystore "%JAVA_HOME%/jre/lib/security/cacerts"
(nie musisz podawać hasła)Jeśli brakuje certyfikatu, możesz go uzyskać, pobierając go za pomocą przeglądarki i dodając go do magazynu zaufanych certyfikatów za pomocą następującego polecenia:
keytool -import -noprompt -trustcacerts -alias <AliasName> -file <certificate> -keystore <KeystoreFile> -storepass <Password>
Po zaimportowaniu możesz ponownie uruchomić pierwsze polecenie, aby sprawdzić, czy certyfikat został dodany.
Informacje o Sun / Oracle można znaleźć tutaj .
źródło
keytool error: java.io.FileNotFoundException ... (Access is denied)
podczas próby zaimportowania certyfikatu.• Gdy otrzymałem błąd, próbowałem wyjawić znaczenie wyrażenia przez Google i stwierdziłem, że ten problem występuje, gdy serwer zmienia certyfikat SSL HTTPS, a nasza starsza wersja java nie rozpoznaje głównego ośrodka certyfikacji (CA) .
• Jeśli masz dostęp do adresu URL HTTPS w przeglądarce, możesz zaktualizować Javę, aby rozpoznała główny urząd certyfikacji.
• W przeglądarce przejdź do adresu URL HTTPS, do którego Java nie mogła uzyskać dostępu. Kliknij łańcuch certyfikatów HTTPS (w przeglądarce Internet Explorer znajduje się ikona kłódki), kliknij blokadę, aby wyświetlić certyfikat.
• Przejdź do „Szczegóły” certyfikatu i „Kopiuj do pliku”. Skopiuj go w formacie Base64 (.cer) . Zostanie zapisany na pulpicie.
• Zainstaluj certyfikat, ignorując wszystkie alerty.
• W ten sposób zebrałem informacje o certyfikacie adresu URL, do którego próbowałem uzyskać dostęp.
Teraz musiałem sprawić, aby moja wersja java wiedziała o certyfikacie, aby dalej nie odmawiał rozpoznania adresu URL. W związku z tym muszę wspomnieć, że wylogowałem się, że informacje o certyfikacie głównym pozostają domyślnie w lokalizacji JDK \ jre \ lib \ security , a domyślne hasło dostępu to: changeit.
Aby wyświetlić informacje o cacertach, należy postępować zgodnie z następującymi procedurami:
• Kliknij przycisk Start -> Uruchom
• Wpisz cmd. Wiersz polecenia zostanie otwarty (może być konieczne otwarcie go jako administratora).
• Przejdź do swojego
Java/jreX/bin
katalogu• Wpisz następujące polecenie
Podaje listę bieżących certyfikatów zawartych w magazynie kluczy. Wygląda to mniej więcej tak:
• Teraz musiałem dołączyć wcześniej zainstalowany certyfikat do cacerts.
• W tym celu procedura jest następująca:
Jeśli używasz Java 7:
• Następnie doda informacje o certyfikacie do pliku cacert.
To rozwiązanie znalazłem dla wyżej wspomnianego wyjątku !!
źródło
Jak to zrobić w Tomcat 7
Chciałem obsługiwać samopodpisany certyfikat w aplikacji Tomcat, ale następujący fragment kodu nie działa
oto, co rozwiązało mój problem:
1) Pobierz
.crt
plik<your domain>
swoją domenę (np.jossef.com
)2) Zastosuj
.crt
plik wcacerts
magazynie certyfikatów Java<your domain>
swoją domenę (np.jossef.com
)<JAVA HOME>
swój katalog domowy java3) Włam się
Mimo że iv zainstalowałem mój certyfikat w
Java
domyślnych magazynach certyfikatów, Tomcat ignoruje to (wygląda na to, że nie jest skonfigurowane do używania domyślnych magazynów certyfikatów Javy).Aby zhakować to, dodaj gdzieś w kodzie:
źródło
W moim przypadku problem polegał na tym, że serwer WWW wysyłał tylko certyfikat i pośredni urząd certyfikacji, a nie główny urząd certyfikacji. Dodanie tej opcji JVM rozwiązało problem:
-Dcom.sun.security.enableAIAcaIssuers=true
Źródło
źródło
Innym powodem może być przestarzała wersja JDK. Używałem jdk w wersji 1.8.0_60, po prostu aktualizacja do najnowszej wersji rozwiązała problem z certyfikatem.
źródło
Mój plik cacerts był całkowicie pusty. Rozwiązałem to, kopiując plik cacerts z mojego komputera z systemem Windows (który używa Oracle Java 7) i scpded go do mojego Linux-a (OpenJDK).
a następnie na maszynie z Linuksem
Do tej pory działało świetnie.
źródło
Dla mnie ten błąd pojawił się również podczas próby połączenia się z procesem za odwrotnym proxy NGINX, który obsługiwał SSL.
Okazało się, że problemem był certyfikat bez powiązania całego łańcucha certyfikatów. Kiedy dodałem pośrednie certyfikaty, problem został rozwiązany.
Mam nadzieję że to pomoże.
źródło
Używając Tomcat 7 pod Linuksem, załatwiło sprawę.
Pod Linuksem
$JAVA_HOME
nie zawsze jest konfigurowany, ale zwykle/etc/alternatives/jre
wskazuje$JAVA_HOME/jre
źródło
Poniższy kod działa dla mnie:
źródło
Korzystałem
jdk1.8.0_171
z tego samego problemu. Próbowałem tutaj 2 najlepszych rozwiązań (dodawanie certyfikatu za pomocą keytool i innego rozwiązania, które zawiera hack), ale one nie działały dla mnie.Zaktualizowałem mój JDK do
1.8.0_181
i działało to jak urok.źródło
napisałem mały, głupi skrypt cmd (wiersz poleceń) Win32 (WinXP 32bit testet), który wyszukuje wszystkie wersje Java w plikach programu i dodaje do nich certyfikat. Hasło musi być domyślnym „changeit” lub zmienić je samodzielnie w skrypcie :-)
źródło
Dla MacOS X poniżej znajduje się dokładne polecenie, które działało dla mnie, gdzie musiałem spróbować z podwójnym łącznikiem w opcji „importcert”, która działała:
źródło
Dla mnie nie działa rozpoznane rozwiązanie z tego postu: https://stackoverflow.com/a/9619478/4507034 .
Zamiast tego udało mi się rozwiązać problem, importując certyfikat do zaufanych certyfikatów mojego komputera.
Kroki:
https://localhost:8443/yourpath
), Na którym certyfikacja nie działa.Manage computer certificates
Trusted Root Certification Authorities
->Certificates
your_certification_name.cer
plik.źródło
Aby Tomcat działający na serwerze Ubuntu, aby dowiedzieć się, która Java jest używana, użyj polecenia „ps -ef | grep tomcat”:
Próba:
Następnie możemy przejść do: cd /usr/local/java/jdk1.7.0_15/jre/lib/security
Domyślny plik cacerts znajduje się tutaj. Włóż do niego niezaufany certyfikat.
źródło
dla bezpieczeństwa nie powinniśmy używać samopodpisanych certyfikatów w naszej implementacji. Jeśli jednak chodzi o programowanie, często musimy korzystać ze środowisk testowych, które otrzymały certyfikaty z podpisem własnym. Próbowałem rozwiązać ten problem programowo w kodzie i nie udało mi się. Jednak dodanie certyfikatu do zaufanego sklepu jre naprawiło mój problem. Poniżej znajdują się kroki,
Pobierz certyfikat strony,
Skopiuj certyfikat (np .: plik_certyfikatu.cer) do katalogu $ JAVA_HOME \ Jre \ Lib \ Security
Otwórz CMD w Administratorze i zmień katalog na $ JAVA_HOME \ Jre \ Lib \ Security
Zaimportuj certyfikat do magazynu zaufania, używając polecenia poniżej,
Jeśli wystąpił błąd informujący, że keytool nie jest rozpoznawalny, zapoznaj się z tym.
Wpisz tak jak poniżej
Aktualizacja
Jeśli serwerem aplikacji jest jboss, spróbuj dodać poniżej właściwości systemowej
Mam nadzieję że to pomoże!
źródło
ROZWIĄZANIE DO ROZWIĄZANIA (Alpine Linux)
Aby rozwiązać ten problem w naszych środowiskach aplikacji, przygotowaliśmy następujące polecenia terminala Linux:
Wygeneruje plik cert w katalogu domowym.
To polecenie instaluje openssl w alpejskim systemie Linux. Możesz znaleźć odpowiednie polecenia dla innych dystrybucji Linuksa.
Wygenerowano potrzebny plik cert.
Zastosował wygenerowany plik do środowiska JRE za pomocą programu „keytool”.
Uwaga: zamień swój DNS na
<host-dns-ssl-belongs>
Uwaga 2 : Proszę delikatnie pamiętać, że
-noprompt
nie wyświetli komunikatu weryfikacyjnego (tak / nie), a-storepass changeit
parametr wyłączy monit o podanie hasła i poda wymagane hasło (domyślnie jest to „zmień”). Te dwie właściwości pozwolą ci używać tych skryptów w środowiskach aplikacji, takich jak budowanie obrazu Docker.Uwaga 3 Jeśli wdrażasz aplikację za pomocą Dockera, możesz wygenerować tajny plik jeden raz i umieścić go w plikach projektu aplikacji. Nie będziesz musiał generować go wielokrotnie.
źródło
Też mam ten problem.
Próbowałem prawie wszystkiego, dodając certyfikat SSL do .keystore, ale to nie działało z Java1_6_x. Dla mnie pomogło, jeśli zaczniemy używać nowszej wersji Java, Java1_8_x jako JVM.
źródło
Miałem ten problem z Android Studio, gdy jestem za serwerem proxy. Korzystałem z Crashlytics, który próbuje załadować plik mapowania podczas kompilacji.
Dodałem brakujący certyfikat proxy do magazynu zaufania znajdującego się pod adresem
/Users/[username]/Documents/Android Studio.app/Contents/jre/jdk/Contents/Home/jre/lib/security/cacerts
za pomocą następującego polecenia:
keytool -import -trustcacerts -keystore cacerts -storepass [password] -noprompt -alias [alias] -file [my_certificate_location]
na przykład z domyślnym hasłem do magazynu zaufanych certyfikatów
keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias myproxycert -file /Users/myname/Downloads/MyProxy.crt
źródło
Tylko mały hack. Zaktualizuj adres URL w pliku „hudson.model.UpdateCenter.xml” z https na http
źródło
Chcę się włączyć, ponieważ mam środowisko QEMU, w którym muszę pobierać pliki w Javie. Okazuje się, że
/etc/ssl/certs/java/cacerts
w QEMU ma problem, ponieważ nie pasuje do/etc/ssl/certs/java/cacerts
środowiska hosta. Środowisko hosta znajduje się za firmowym serwerem proxy, więc Java Cacerts jest dostosowaną wersją.Jeśli używasz środowiska QEMU, upewnij się, że system hosta może najpierw uzyskać dostęp do plików. Na przykład możesz najpierw wypróbować ten skrypt na komputerze-hoście. Jeśli skrypt działa dobrze na komputerze hosta, ale nie w QEMU, oznacza to, że masz ten sam problem co ja.
Aby rozwiązać ten problem, musiałem wykonać kopię zapasową oryginalnego pliku w QEMU, skopiować plik w środowisku hosta do więzienia chroot QEMU, a następnie java mogłaby normalnie pobierać pliki w QEMU.
Lepszym rozwiązaniem byłoby zamontowanie
/etc
w środowisku QEMU; nie jestem jednak pewien, czy w tym procesie wpłynie to na inne pliki. Postanowiłem więc użyć tego brzydkiego, ale łatwego obejścia.źródło
Wydaje się, że jest to równie dobre miejsce do udokumentowania innego możliwego powodu niesławnego komunikatu o błędzie PKIX. Po zbyt długim spoglądaniu na zawartość magazynu kluczy i zaufanych certyfikatów oraz różne konfiguracje instalacji Java, zdałem sobie sprawę, że mój problem polegał na ... literówce.
Literówka oznaczała, że używałem również magazynu kluczy jako magazynu zaufania. Ponieważ moje firmy główny urząd certyfikacji nie został zdefiniowany jako samodzielny certyfikat w magazynie kluczy, ale tylko jako część łańcucha certyfikatów, i nie został zdefiniowany nigdzie indziej (tj. Cacerts), ciągle pojawiał się błąd PKIX.
Po nieudanym wydaniu (jest to konfiguracja prod, gdzie indziej było ok) i po dwóch dniach drapania się po głowie w końcu zobaczyłem literówkę, a teraz wszystko jest dobrze.
Mam nadzieję, że to komuś pomoże.
źródło
dodaj to do swojego kodu:
źródło