Patrzę, jak uzyskać lokalizację cacerts
domyślnej instalacji Java, gdy nie masz JAVA_HOME
lub nie JRE_HOME
zdefiniowano.
Potrzebuję rozwiązania, które działa przynajmniej w przypadku OS X
i Linux
.
Tak. java -v
zakłada się, że działa :)
Odpowiedzi:
W systemie Linux , aby znaleźć lokalizację $JAVA_HOME
:
readlink -f /usr/bin/java | sed "s:bin/java::"
cacerts
podlegają lib/security/cacerts
:
$(readlink -f /usr/bin/java | sed "s:bin/java::")lib/security/cacerts
W systemie Mac OS X , aby znaleźć $JAVA_HOME
run:
/usr/libexec/java_home
cacerts
podlegają 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
/usr/libexec/java_home
daje mi inną odpowiedź niż readlink
powyższa komenda bazująca na -bazie, a pierwsza wydaje się być poprawna, ponieważ zawiera cacerts
plik.
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.
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
~/.sdkman/candidates/java/current/lib/security
/usr/libexec/java_home