Jak uzyskać lokalizację cacerts domyślnej instalacji Java?

92

Patrzę, jak uzyskać lokalizację cacertsdomyślnej instalacji Java, gdy nie masz JAVA_HOMElub nie JRE_HOMEzdefiniowano.

Potrzebuję rozwiązania, które działa przynajmniej w przypadku OS Xi Linux.

Tak. java -vzakłada się, że działa :)

sorin
źródło

Odpowiedzi:

160

W systemie Linux , aby znaleźć lokalizację $JAVA_HOME:

readlink -f /usr/bin/java | sed "s:bin/java::"

cacertspodlegają lib/security/cacerts:

$(readlink -f /usr/bin/java | sed "s:bin/java::")lib/security/cacerts

W systemie Mac OS X , aby znaleźć $JAVA_HOMErun:

/usr/libexec/java_home

cacertspodlegają Home/lib/security/cacerts:

$(/usr/libexec/java_home)/lib/security/cacerts

AKTUALIZACJA (OS X z JDK)

powyższy kod został przetestowany na komputerze bez zainstalowanego JDK. Po zainstalowaniu JDK, jak powiedział pR0Ps , jest to

$(/usr/libexec/java_home)/jre/lib/security/cacerts
Kuf
źródło
6
W systemie OS X działa „oficjalny” sposób na znalezienie JAVA_HOME/usr/libexec/java_home
Daniel Serodio
2
@DanielSerodio, zgodził się. /usr/libexec/java_homedaje mi inną odpowiedź niż readlinkpowyższa komenda bazująca na -bazie, a pierwsza wydaje się być poprawna, ponieważ zawiera cacertsplik.
Andrew Ferrier,
1
@DanielSerodio i AndrewFerrier dzięki chłopaki, zaktualizowano odpowiedź.
Kuf
@Kuf Mój JDK nie ma tego folderu lib / security na Mac Yosemite. Jestem pewien, że jestem w porządku $ JAVA_HOME
Brian
1
W systemie OSX 10.10.5 folder bezpieczeństwa znajduje się w: Strona główna / jre / lib / security
Sid Sarasvati
47

W systemie OS X 10.10.1 (Yosemite) lokalizacja cacertspliku została zmieniona na

$(/usr/libexec/java_home)/jre/lib/security/cacerts
pR0Ps
źródło
10

Jeśli chcesz uzyskać dostęp do tych certyfikatów w sposób programowy, najlepiej w ogóle nie używać tego pliku, ale uzyskać do niego dostęp za pośrednictwem menedżera zaufania. Poniższy kod pochodzi z przypadku testowego OpenJDK (który zapewnia, że ​​zbudowana kolekcja cacerts nie jest pusta):

TrustManagerFactory trustManagerFactory =
    TrustManagerFactory.getInstance("PKIX");
trustManagerFactory.init((KeyStore) null);
TrustManager[] trustManagers =
    trustManagerFactory.getTrustManagers();
X509TrustManager trustManager =
    (X509TrustManager) trustManagers[0];
X509Certificate[] acceptedIssuers =
    trustManager.getAcceptedIssuers();

Nie musisz więc zajmować się lokalizacją pliku ani hasłem do magazynu kluczy.

eckes
źródło
To nie jest odczyt certyfikatu zainstalowanego w cacerts. jestem w stanie, jeśli używam ścieżki do pliku i hasła
Somnath Singh
8

W systemie MacOS Mojave lokalizacja to:

/Library/Java/JavaVirtualMachines/jdk1.8.0_192.jdk/Contents/Home/jre/lib/security/cacerts 

Jeśli używasz sdkman do zarządzania wersjami Java, cacerts jest w

~/.sdkman/candidates/java/current/jre/lib/security
Nish
źródło
1
UWAGA: W przypadku aktualnych wersji sdkman w / JDK 11 lokalizacja to~/.sdkman/candidates/java/current/lib/security
Snekse
3

W High Sierra cacerts znajduje się pod adresem:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/security/cacerts

arpurush
źródło
1

Możesz także sprawdzić readlink -f " which java". Jednak może to nie działać dla wszystkich opakowań binarnych. Najprawdopodobniej lepiej jest faktycznie rozpocząć klasę Java.

eckes
źródło