Como descubro qual keystore minha JVM está usando?

125

Preciso importar um certificado para meu keystore da JVM. Estou usando o seguinte:

keytool -import -alias daldap -file somecert.cer

então provavelmente precisaria mudar minha ligação para algo como:

keytool -import -alias daldap -file somecert.cer -keystore cacerts storepass changeit
jini
fonte
1
Você precisa importar um certificado para o seu armazenamento confiável da JVM , a menos que seja um CSR assinado; nesse caso, você deve importá-lo para seu próprio keystore e já deve saber onde está, caso contrário, não seria possível gerar o par de chaves ou o CSR.
Marquês de Lorne

Respostas:

129

Seu keystore estará no seu JAVA_HOME---> JRE -->lib---> security--> cacerts. Você precisa verificar onde seu JAVA_HOME está configurado, possivelmente um desses lugares,

  1. Computador ---> Avançado -> Variáveis ​​de ambiente ---> JAVA_HOME

  2. Os arquivos em lote de inicialização do servidor.

No seu comando de importação -keystore cacerts (forneça o caminho completo para o JRE acima aqui em vez de apenas dizer cacerts).

kosa
fonte
6
/ Library / Java / Home / lib / security / cacerts no Mac OS X 10.9
Sam Barnum
9
* "JAVA_HOME ---> JRE -> lib ---> security -> cacerts" Observe os "s" no final, apenas para futuros leitores.
Keir Nellyer
4
Portanto, se eu instalar uma nova versão do Java e o JAVA_HOME estiver apontando para um novo diretório, terei problemas de certificado?
Kirill Yunussov
1
@Murphy: Isso pode ajudá-lo a stackoverflow.com/questions/5251323/…
kosa
4
esse é o local da loja confiável, em vez do local principal da loja, eu acho.
user2001850
35

Localização do Keystore

Cada comando keytool possui uma -keystoreopção para especificar o nome e o local do arquivo persistente de keystore para o keystore gerenciado pelo keytool. O keystore é armazenado por padrão em um arquivo nomeado .keystoreno diretório inicial do usuário, conforme determinado pela propriedade do sistema "user.home". Com o nome de usuário uName, o valor da propriedade "user.home" é padronizado como

C:\Users\uName on Windows 7 systems
C:\Winnt\Profiles\uName on multi-user Windows NT systems
C:\Windows\Profiles\uName on multi-user Windows 95 systems
C:\Windows on single-user Windows 95 systems

Portanto, se o nome do usuário for "cathy", "user.home" será padronizado como

C:\Users\cathy on Windows 7 systems
C:\Winnt\Profiles\cathy on multi-user Windows NT systems
C:\Windows\Profiles\cathy on multi-user Windows 95 systems

http://docs.oracle.com/javase/1.5/docs/tooldocs/windows/keytool.html

dbrin
fonte
Eu estive procurando por este ~/.keystorearquivo misterioso ! Se eu deixasse o -keystoreparâmetro, não conseguiria descobrir qual keytoolsegmentação de keystore padrão . Continuei procurando por outro cacertslugar na máquina. Eu não esperava que o keytool gerasse ~/.keystoreno diretório inicial nem que fosse nomeado em .keystorevez de cacerts. Você preencheu um espaço em branco que o pessoal do Java deve documentar! Obrigado!
George Pantazes
26

Mac OS X 10.12 com Java 1.8:

$ JAVA_HOME / jre / lib / security

cd $JAVA_HOME

/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home

A partir daí, está em:

./jre/lib/security

Eu tenho um keystore de cacerts lá.

Para especificar isso como uma opção de VM:

-Djavax.net.ssl.trustStore=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home/jre/lib/security/cacerts -Djavax.net.ssl.trustStorePassword=changeit

Não estou dizendo que esta é a maneira correta (por que o java não sabe procurar dentro de JAVA_HOME?), Mas é isso que eu tinha que fazer para fazê-lo funcionar.

hoje
fonte
16

Você pode encontrá-lo no diretório "Página inicial":

No Windows 7:

C:\Users\<YOUR_ACCOUNT>\.keystore

No Linux (Ubuntu):

/home/<YOUR_ACCOUNT>/.keystore
Evans Y.
fonte
4
eu não tenho este diretório no Windows
simgineer
1
Eu fiz um -keygen sem especificar um keystore, esperando que ele criasse um no diretório atual, mas ele foi criado em minha casa, como você disse. ~ / .keystore Não foi possível encontrá-lo por muito tempo! :-) Obrigado.
Eurospoofer 8/02
deixe-me acrescentar que, sob cygwin o caminho do Windows é usado desde que a propriedade java user.homeé igual ao $HOMEDRIVE$HOMEPATHdefinido pelo Windows e não em $HOMEconjunto pelo cygwin onde HOMEDRIVE=C:eHOMEPATH=\Users\[YOUR ACCOUNT]
user1708042
13

Isso funciona para mim:

#! / bin / bash

CACERTS = $ ( readlink - e $ ( dirname $ ( readlink - e $ ( que ferramenta )))) /../ lib / security / cacerts )

if keytool - list - keystore $ CACERTS - storepass changeit > / dev / null ; então  
    eco $ CACERTS
else 
    echo 'Não foi possível encontrar o arquivo cacerts.' > & 2 
    saída 1 fi 

Somente para Linux. Meu Solaris não possui link de leitura. No final, eu usei este Perl-Script:

#! / usr / bin / env perl use strict ; use avisos ; use Cwd qw ( caminho real ); 
$ _ = realpath (( grep {- x && - f } mapa { "$ _ / keytool" ) split ( ':' , $ ENV { PATH })) [ 0 ]); die "Não é possível encontrar o keytool", a menos que seja definido $ _ ; minha $ keytool = $ _ ; impressão


  
  

 "Usando '$ keytool'. \ N" ; 
s / keytool $ / /;
$ _ = caminho real ($ _. '../ lib / security / cacerts ');
die "Não é possível encontrar cacerts", a menos que -f $ _;
meus $ cacerts = $ _;
print "Importando para ' $ cacerts '. \ n";
`$ keytool -list -keystore" $ cacerts "-storepass changeit`;
die "Não é possível ler o contêiner de chaves", a menos que $? == 0;
exit se $ ARGV [0] eq ' - d ';
foreach (@ARGV) {
    meu $ cert = $ _;
    s /\.//^.
    meu $ alias = $ _;
    print "Importando ' $ cert ' como ' $ alias '. \ n";
    `keytool -importcert -file" $ cert "-alias" $ alias "-keystore" $ cacerts "-storepass changeit`;
    aviso "Não é possível importar o certificado: $?" a menos que $? == 0;
}
ceving
fonte
6

Como o DimtryB mencionou, por padrão, o keystore está no diretório do usuário. Mas se você estiver tentando atualizar o cacertsarquivo, para que a JVM possa escolher as chaves, será necessário atualizar o cacertsarquivo em jre/lib/security. Você também pode visualizar as chaves executando o comando keytool -list -keystore cacertspara ver se seu certificado foi adicionado.

Sharan Rajendran
fonte
É bom saber que o comando keytool adiciona o lib/securitycaminho correto automaticamente se receber apenas o nome relativo.
ceving
1
Mas isso não vai funcionar -importcert. O comando list mostra os certificados em todo o sistema, mas o comando import gera um novo arquivo no diretório atual.
ceving 05/12/12
1
updatedb; locate cacertsajuda a descobrir onde estão os locais de instalação dos arquivos cacerts.
S28 /
5

No Debian, usando a versão openjdk "1.8.0_212", encontrei cacerts aqui:

 /etc/ssl/certs/java/cacerts

Certamente seria útil se houvesse um comando padrão que imprimisse esse caminho.

Patrick Beard
fonte
1

Para mim, usando a imagem oficial do OpenJDK 12 Docker , o local do keystore Java era:

/usr/java/openjdk-12/lib/security/cacerts
jonashackt
fonte
É um armazenamento confiável, não um keystore.
Marquês de Lorne
1
Primeiro: se você ler a pergunta com atenção (e seu próprio comentário), ela soa mais como um armazenamento confiável, para o qual um certificado deve ser importado. Segundo, a diferença entre o Truststore e o Keystore é bastante desorientadora - e ambos usam o termo "Keystore", já que usam o formato ambos. Terceiro: se você der uma olhada no comando import, keytool -import -file example.crt -alias exampleCA -keystore truststore.jkstambém usará o parâmetro -keystore... IMHO pouco claro. E por último mas não menos importante: eu estava pesquisando exatamente sobre esse problema - e achei essa pergunta. Talvez outros expiram o mesmo.
jonashackt
Além disso, todas as outras respostas também se referem ao chamado "armazenamento confiável" que o JDK usa para validar. Você também reduziu todas as outras respostas? Eu já recebi um voto positivo, então já há alguém que minha resposta ajudou.
Jonashackt # 0219
0

Encontramos esse problema em um Tomcat executando a partir de um diretório jre que foi (quase totalmente) removido após uma atualização automática do jre, para que o jre em execução não pudesse mais encontrar o jre ... / lib / security / cacerts porque ele não existia mais.

Reiniciar o Tomcat (depois de alterar a configuração para executar a partir do local diferente do jre) corrigiu o problema.

Nicolas de Jong
fonte
0

Além de todas as respostas acima:

Se a atualização do arquivo cacerts no diretório JRE não ajudar, tente atualizá-lo no JDK.

C: \ Arquivos de programas \ Java \ jdk1.8.0_192 \ jre \ lib \ security

VSh
fonte