Как получить расположение cacerts установки Java по умолчанию?


92

Я ищу, как получить местоположение cacertsустановки Java по умолчанию, если у вас его нет JAVA_HOMEили нет JRE_HOME.

Мне нужно решение, которое работает хотя бы для OS Xи Linux.

Да. java -vпредполагается, что работает :)

Ответы:


160

Под Linux , чтобы найти расположение $JAVA_HOME:

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

cacertsнаходятся lib/security/cacerts:

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

В Mac OS X , чтобы найти $JAVA_HOMEзапуск:

/usr/libexec/java_home

cacertsнаходятся Home/lib/security/cacerts:

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

ОБНОВЛЕНИЕ (OS X с JDK)

Приведенный выше код был протестирован на компьютере без установленного JDK. С установленным JDK, как сказал pR0P , он находится на

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

6
В OS X работает «официальный» способ найти JAVA_HOME/usr/libexec/java_home
Даниэль Серодио

2
@DanielSerodio, согласен. /usr/libexec/java_homeдает мне ответ, отличный от приведенной readlinkвыше команды -based, и первая кажется правильной, поскольку она содержит cacertsфайл.
Эндрю Феррье

1
@DanielSerodio и AndrewFerrier спасибо, ребята, ответ обновлен.
Куф

@Kuf Мой JDK не имеет этой папки lib / security на Mac Yosemite. Я уверен, что я нахожусь в правильном месте $ JAVA_HOME
Брайан

1
В OSX 10.10.5 папка безопасности находится в: Home / jre / lib / security
Сид Сарасвати,

47

Начиная с OS X 10.10.1 (Yosemite), расположение cacertsфайла было изменено на

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

10

Если вам нужно получить доступ к этим сертификатам программно, лучше вообще не использовать файл, а получить к нему доступ через диспетчер доверия. Следующий код взят из тестового примера OpenJDK (который проверяет, что созданная коллекция cacerts не пуста):

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

Таким образом, вам не нужно иметь дело с местоположением файла или паролем хранилища ключей.


Это не чтение сертификата, установленного в cacerts. Я могу, если использую путь к файлу и пароль
Сомнатх Сингх

8

В MacOS Mojave это расположение:

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

Если для управления версиями Java используется sdkman, cacerts находится в

~/.sdkman/candidates/java/current/jre/lib/security

1
ПРИМЕЧАНИЕ. Для текущих версий sdkman с JDK 11 расположение~/.sdkman/candidates/java/current/lib/security
Snekse

3

В High Sierra cacerts находится по адресу:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/security/cacerts


1

Вы также можете обратиться к readlink -f " which java". Однако это может не работать для всех двоичных оболочек. Скорее всего, лучше запустить класс Java.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.