Como obter a localização dos cacerts da instalação padrão do java?

91

Eu estou procurando como obter a localização da cacertsinstalação padrão do java, quando você não tem JAVA_HOMEou JRE_HOMEdefinido.

Preciso de uma solução que funcione pelo menos para OS Xe Linux.

Sim. java -vpresume-se que funcione :)

Sorin
fonte

Respostas:

156

No Linux , para encontrar a localização de $JAVA_HOME:

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

o cacertsestão sob lib/security/cacerts:

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

No mac OS X , para encontrar $JAVA_HOMErun:

/usr/libexec/java_home

o cacertsestão sob Home/lib/security/cacerts:

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

ATUALIZAÇÃO (OS X com JDK)

o código acima foi testado em um computador sem JDK instalado. Com o JDK instalado, como pR0Ps disse , é

$(/usr/libexec/java_home)/jre/lib/security/cacerts
Kuf
fonte
6
No OS X, a maneira "oficial" de encontrar JAVA_HOME está em execução/usr/libexec/java_home
Daniel Serodio
2
@DanielSerodio, concordou. /usr/libexec/java_homeme dá uma resposta diferente do readlinkcomando -baseado acima, e o primeiro parece estar correto, pois contém o cacertsarquivo.
Andrew Ferrier
1
@DanielSerodio e AndrewFerrier obrigado pessoal, resposta atualizada.
Kuf
@Kuf Meu JDK não tem essa pasta lib / security no Mac Yosemite. Tenho certeza de que estou no $ JAVA_HOME certo
Brian
1
No OSX 10.10.5, a pasta de segurança está em: Home / jre / lib / security
Sid Sarasvati
47

A partir do OS X 10.10.1 (Yosemite), a localização do cacertsarquivo foi alterada para

$(/usr/libexec/java_home)/jre/lib/security/cacerts
pR0Ps
fonte
9

Se você precisar acessar esses certificados programaticamente, é melhor não usar o arquivo, mas acessá-lo por meio do gerenciador de confiança. O código a seguir é de um caso de teste OpenJDK (que garante que a coleção cacerts construída não esteja vazia):

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

Assim, você não precisa lidar com a localização do arquivo ou a senha do keystore.

eckes
fonte
7

No MacOS Mojave, a localização é:

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

Se estiver usando sdkman para gerenciar versões java, o cacerts está em

~/.sdkman/candidates/java/current/jre/lib/security
Nish
fonte
NOTA: Para as versões atuais do sdkman w / JDK 11, o local é~/.sdkman/candidates/java/current/lib/security
Snekse
3

Em High Sierra, o cacerts está localizado em:/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/jre/lib/security/cacerts

Arpurush
fonte
1

Você também pode consultar readlink -f " which java". No entanto, pode não funcionar para todos os wrappers binários. Provavelmente, é melhor realmente iniciar uma classe Java.

eckes
fonte