Mam klienta Java, który próbuje uzyskać dostęp do serwera z certyfikatem z podpisem własnym.
Gdy próbuję wysłać wiadomość na serwer, pojawia się następujący błąd:
nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego celu
Po przeprowadzeniu badań na ten temat, zrobiłem następujące rzeczy.
- Zapisałem nazwę domeny moich serwerów jako
root.cer
plik. - W środowisku JRE mojego serwera Glassfish uruchomiłem to:
keytool -import -alias example -keystore cacerts -file root.cer
- Aby sprawdzić, czy certyfikat został pomyślnie dodany do mojego cacert, zrobiłem to:
keytool -list -v -keystore cacerts
Widzę, że certyfikat jest obecny. - Następnie ponownie uruchomiłem Glassfish i wycofałem „post”.
Nadal pojawia się ten sam błąd.
Mam wrażenie, że to dlatego, że mój Glassfish nie czyta pliku cacert, który poprawiłem, ale może jakiś inny.
Czy ktoś z was miał ten problem i może popchnąć mnie we właściwym kierunku?
Odpowiedzi:
Niestety - może to być wiele rzeczy - a wiele serwerów aplikacji i innych „opakowań” Java jest skłonnych do zabawy z właściwościami i własnym „własnym” dostępem do pęku kluczy, a co nie. Więc może patrzeć na coś zupełnie innego.
Brak kratownic - spróbowałbym:
sprawdzić, czy to pomaga. Zamiast „wszystko” można również ustawić na „ssl”, menedżer kluczy i menedżer zaufania - co może pomóc w twoim przypadku. Ustawienie go na „help” spowoduje wyświetlenie czegoś takiego jak na większości platform.
Niezależnie od tego - upewnij się, że w pełni rozumiesz różnicę między magazynem kluczy (w którym masz klucz prywatny i certyfikat, z którym udowadniasz swoją tożsamość) a sklepem zaufania (który określa, komu ufasz) - a faktem, że twoja tożsamość również ma „łańcuch” zaufania do katalogu głównego - który jest niezależny od jakiegokolwiek łańcucha do katalogu głównego, którego potrzebujesz, aby dowiedzieć się, komu ufasz.
Źródło: # Patrz http://download.oracle.com/javase/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#Debug
źródło
Oto rozwiązanie, kliknij poniższy link Krok po kroku:
http://www.mkyong.com/webservices/jax-ws/suncertpathbuilderexception-unable-to-find-valid-certification-path-to-requested-target/
PLIK JAVA: którego brakuje w blogu
źródło
public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0];}
Musisz skonfigurować właściwości systemowe JSSE, w szczególności wskazać magazyn certyfikatów klienta.
Za pomocą wiersza poleceń:
lub za pomocą kodu Java:
Więcej informacji można znaleźć w szczegółach na stronie RedHat .
źródło
(repost z mojej drugiej odpowiedzi )
Użyj cli użytkową keytool z dystrybucji oprogramowania Java dla importu (i zaufanie! ) niezbędne certyfikaty
Próba:
Z cli zmień katalog na jre \ bin
Sprawdź plik kluczy (plik znaleziony w katalogu jre \ bin)
keytool -list -keystore .. \ lib \ security \ cacerts
Hasło zostało zmienione
Pobierz i zapisz wszystkie certyfikaty w łańcuchu z potrzebnego serwera.
Dodaj certyfikaty (przed usunięciem atrybutu „tylko do odczytu” z pliku „.. \ lib \ security \ cacerts”), uruchom: keytool -alias REPLACE_TO_ANY_UNIQ_NAME -import -keystore .. \ lib \ security \ cacerts -plik „r: \ root.crt "
przez przypadek znalazłem taką prostą wskazówkę. Inne rozwiązania wymagają użycia InstallCert.Java i JDK
źródło: http://www.java-samples.com/showtutorial.php?tutorialid=210
źródło
Miałem ten sam problem z sbt .
Próbował pobrać zależności z repo1.maven.org przez ssl,
ale stwierdził, że „nie można znaleźć prawidłowej ścieżki certyfikacji do żądanego docelowego adresu URL”.
więc śledziłem ten post i nadal nie mogłem zweryfikować połączenia.
Przeczytałem o tym i stwierdziłem, że certyfikat root nie jest wystarczający, jak sugerował post, więc -
rzeczą, która działała dla mnie, było zaimportowanie pośrednich certyfikatów CA do magazynu kluczy .
Właściwie dodałem wszystkie certyfikaty w łańcuchu i działało to jak urok.
źródło
Rozwiązanie podczas migracji z JDK 8 do JDK 10
certs
JDK 10
JDK 8
Kroki do naprawienia
jlink
as/opt/jdk/bin/jlink \ --module-path /opt/jdk/jmods...
Oto różne ścieżki i sekwencja poleceń ...
źródło
Pracuję nad samouczkiem dla usług sieciowych REST na stronie www.udemy.com (REST Java Web Services). Przykład w samouczku mówi, że aby mieć SSL, musimy mieć folder o nazwie „trust_store” w moim projekcie „klienta” zaćmienia, który powinien zawierać plik „magazynu kluczy” (mieliśmy projekt „klienta” do wywołania usługi oraz projekt „usługa”, który zawierał serwis internetowy REST - 2 projekty w tym samym obszarze roboczym zaćmienia, jeden klient, drugi serwis). Aby uprościć sprawę, powiedzieli, aby skopiować plik „keystore.jks” z serwera aplikacji glassfish (glassfish \ domains \ domain1 \ config \ keystore.jks), którego używamy, i umieścić go w tym folderze „trust_store”, w którym kazali mi zrobić projekt klienta. Wydaje się to mieć sens: samopodpisane certyfikaty na serwerze „ s key_store odpowiada certyfikatom w kliencie trust_store. Teraz robiąc to, otrzymałem błąd, o którym wspomina oryginalny post. Poszukałem tego i przeczytałem, że błąd wynika z pliku „keystore.jks” na kliencie nie zawierającego zaufanego / podpisanego certyfikatu, że znaleziony certyfikat jest samopodpisany.
Aby wszystko było jasne, powiem, że w moim rozumieniu plik „keystore.jks” zawiera certyfikaty z podpisem własnym, a plik „cacerts.jks” zawiera certyfikaty CA (podpisane przez urząd certyfikacji). „Plik keystore.jks” to „magazyn kluczy”, a „cacerts.jks” to „magazyn zaufania”. Jak komentuje „Bruno”, komentator powyżej, „keystore.jks” jest lokalny, a „cacerts.jks” jest dla zdalnych klientów.
Więc powiedziałem sobie: hej, glassfish ma również plik „cacerts.jks”, który jest plikiem trust_store glassfish. cacerts.jsk powinien zawierać certyfikaty CA. I najwyraźniej potrzebuję, aby mój folder trust_store zawierał plik magazynu kluczy, który ma co najmniej jeden certyfikat CA. Próbowałem więc umieścić plik „cacerts.jks” w utworzonym przeze mnie folderze „trust_store” w projekcie klienta i zmienić właściwości maszyny wirtualnej, aby wskazywały „cacerts.jks” zamiast „keystore.jks”. Pozbyłem się błędu. Chyba wszystko, czego potrzebował, to certyfikat CA do pracy.
Może to nie być idealne do produkcji, a nawet do rozwoju, poza czymś, co wystarczy do pracy. Na przykład prawdopodobnie można użyć polecenia „keytool”, aby dodać certyfikaty CA do pliku „keystore.jks” na kliencie. Ale i tak mam nadzieję, że przynajmniej zawęzi to możliwe scenariusze, które mogą się wydarzyć, aby spowodować błąd.
RÓWNIEŻ: moje podejście wydawało się przydatne dla klienta (certyfikat serwera dodany do klienta trust_store), wygląda na to, że powyższe komentarze do rozwiązania oryginalnego postu są przydatne dla serwera (certyfikat klienta dodany do serwera trust_store). Twoje zdrowie.
Konfiguracja projektu Eclipse:
--- cacerts.jks --- keystore.jks
Urywek z pliku MyClientProject.java:
źródło
Mój problem polegał na tym, że Broker zabezpieczeń dostępu do chmury, NetSkope, został zainstalowany na moim laptopie roboczym poprzez aktualizację oprogramowania. Zmieniało to łańcuch certyfikatów i po zaimportowaniu całego łańcucha do magazynu kluczy cacerts nadal nie byłem w stanie połączyć się z serwerem za pośrednictwem mojego klienta Java. Wyłączyłem NetSkope i udało mi się nawiązać połączenie.
źródło
W moim przypadku stanąłem przed problemem, ponieważ w moim procesie tomcat podano określony plik kluczy
Poza tym importowałem certyfikat do cacert JRE / lib / security i zmiany nie odzwierciedlały. Następnie zrobiłem poniżej polecenia, gdzie /tmp/cert1.test zawiera certyfikat serwera docelowego
Możemy dokładnie sprawdzić, czy import certyfikatu się powiódł
i sprawdź, czy Twój serwer tagów został znaleziony przeciwko aliasowi rapidssl-myserver
źródło
Sprawdź, czy plik
$JAVA_HOME/lib/security/cacerts
istnieje! W moim przypadku nie był to plik, ale łącze do/etc/ssl/certs/java/cacerts
a także to był link do siebie (CO ??), dlatego JVM nie może znaleźć pliku.Rozwiązanie: Skopiuj prawdziwy plik cacerts ( możesz to zrobić z innego JDK ) do
/etc/ssl/certs/java/
katalogu, a to rozwiąże problem :)źródło
rm -f /opt/jdk-minimal/jre/lib/security/cacerts ; ln -s /etc/ssl/certs/java/cacerts /opt/jdk-minimal/jre/lib/security/cacerts
Powiedzmy, że używasz zmiennych ścieżki klas, takich jak $ {JAVA_HOME} w pom.xml.
Do celów dodaj zmienne ścieżki klasy. tj., -DANT_HOME, -DJAVA_HOME
źródło