Trust Store vs Key Store - criando com o keytool

249

Entendo que o keystore normalmente reteria chaves públicas / privadas e o armazenamento confiável apenas chaves públicas (e representa a lista de partes confiáveis ​​com as quais você pretende se comunicar). Bem, essa é minha primeira suposição, então, se isso não estiver correto, provavelmente não comecei muito bem ...

No entanto, eu estava interessado em entender como / quando você distingue as lojas ao usar o keytool.

Até agora, eu criei um keystore usando

keytool -import -alias bob -file bob.crt -keystore keystore.ks

que cria meu arquivo keystore.ks. Eu respondo yesà pergunta em que confio em bob, mas não está claro para mim se isso criou um arquivo de keystore ou um arquivo de armazenamento confiável? Também posso configurar meu aplicativo para usar o arquivo.

-Djavax.net.ssl.keyStore=keystore.ks -Djavax.net.ssl.keyStorePassword=x
-Djavax.net.ssl.trustStore=keystore.ks -Djavax.net.ssl.trustStorePassword=x

e com System.setProperty( "javax.net.debug", "ssl") set, posso ver o certificado em certificações confiáveis ​​(mas não na seção keystore). O certificado específico que estou importando tem apenas uma chave pública e pretendo usá-lo para enviar coisas por uma conexão SSL para Bob (mas talvez seja melhor deixar para outra pergunta!).

Qualquer indicação ou esclarecimento seria muito apreciado. A saída do keytool é a mesma que você importa e é apenas uma convenção que diz que um é um keystore e o outro um trust trust? Qual é o relacionamento ao usar SSL, etc?

Toby
fonte
Não sei ao certo o que você quer dizer com "O certificado específico que estou importando possui apenas uma chave pública": é apenas uma chave pública (ou seja, não um certificado) ou um certificado que não é da CA?
Bruno
hmmm, não tenho certeza. Exportei do meu navegador como um arquivo PEM. Isso ajuda?
Toby
Se for exportado do navegador, provavelmente é um certificado. É um certificado de servidor (com um CN ou subjectAltName que corresponde ao nome de um servidor)? É um certificado de CA (veja em Restrições básicas, você poderá vê-lo usando o navegador).
Bruno
2
tl; dr: os armazenamentos confiáveis ​​contêm certificados públicos, confiáveis, raiz (CA), enquanto os armazenamentos de identidade / chave contêm certificados privados e de identidade; em termos de arquivo, no entanto, eles são os mesmos.
Andrew Andrew

Respostas:

346

A terminologia é um pouco confusa, mas ambas javax.net.ssl.keyStoree javax.net.ssl.trustStoresão usadas para especificar quais keystores usar, para dois propósitos diferentes. Os keystores vêm em vários formatos e nem são necessariamente arquivos (consulte esta pergunta ) e keytoolé apenas uma ferramenta para executar várias operações neles (importação / exportação / lista / ...).

A javax.net.ssl.keyStoree javax.net.ssl.trustStoreparâmetros são os parâmetros por defeito utilizado para construir KeyManagers e TrustManagers (respectivamente), em seguida, utilizada para construir um SSLContextque contém essencialmente o SSL / TLS configurações para uso na tomada de um SSL / TLS ligação através de um SSLSocketFactoryou uma SSLEngine. Essas propriedades do sistema são exatamente de onde vêm os valores padrão, que são então usados ​​por eles mesmos SSLContext.getDefault(), por SSLSocketFactory.getDefault()exemplo. (Tudo isso pode ser personalizado por meio da API em vários locais, se você não quiser usar os valores padrão e os SSLContexts específicos para uma determinada finalidade.)

A diferença entre KeyManagere TrustManager(e, portanto, entre javax.net.ssl.keyStoree javax.net.ssl.trustStore) é a seguinte (citada no guia de referência do JSSE ):

TrustManager: determina se as credenciais de autenticação remota (e, portanto, a conexão) devem ser confiáveis.

KeyManager: determina quais credenciais de autenticação enviar ao host remoto.

(Outros parâmetros estão disponíveis e seus valores padrão são descritos no guia de referência do JSSE . Observe que, embora exista um valor padrão para o armazenamento confiável, não existe um para o armazenamento de chaves).

Essencialmente, o armazenamento de chaves javax.net.ssl.keyStoredestina-se a conter suas chaves e certificados privados, enquanto o armazenamento de chaves javax.net.ssl.trustStoredeve conter os certificados de CA nos quais você deseja confiar quando uma parte remota apresenta seu certificado. Em alguns casos, eles podem ser um e o mesmo armazenamento, embora muitas vezes seja uma prática melhor usar armazenamentos distintos (especialmente quando são baseados em arquivos).

Bruno
fonte
obrigado pela resposta, esclarece um pouco as coisas. Ainda estou confuso, porém, quando se trata de uso, posso usar uma chave pri / pub pk12 (xxx.p12) como um armazenamento de chaves (via -D) e criar uma conexão SSL (confiável) sem mencionar um armazenamento confiável via - D ... tudo bem.
Toby
57
Você não precisa especificar um armazenamento confiável, porque existe um valor padrão para ele (ele vem com o JRE), geralmente no $JAVA_HOME/lib/security/cacerts(consulte o segundo link do guia de referência do JSSE que enviei). Como os navegadores, ele contém um conjunto padrão de certificados de CA confiáveis. Em geral, um cliente sempre usará um armazenamento confiável para verificar o certificado do servidor, mas o armazenamento de chaves será usado apenas se o servidor solicitar um certificado de cliente e o servidor sempre usará um armazenamento de chaves para sua própria chave + cert, mas o armazenamento confiável será apenas usado se o cliente envia um certificado de cliente.
Bruno
2
Obrigado por informações úteis. No Weblogic, há "armazenamento de chaves de identidade" que armazena o certificado SSL do servidor e, em seguida, existe um "armazenamento de chaves de confiança" que armazena os certificados SSL em que o servidor confia. -store "nada mais é que um" keystore "e" trust-key-store "nada mais é que um" armazenamento confiável "?
hagrawal
@ Bruno também devemos observar que, quando há um "jssecacerts", "cacerts" é ignorado?
usar o seguinte código
61

Para explicar de maneira comum a utilização / finalidade ou o leigo:

TrustStore : como o nome indica, normalmente é usado para armazenar os certificados de entidades confiáveis. Um processo pode manter um armazenamento de certificados de todas as partes confiáveis ​​em que confia.

keyStore : Usado para armazenar as chaves do servidor (públicas e privadas) junto com o certificado assinado.

Durante o handshake SSL,

  1. Um cliente tenta acessar https: //

  2. E, assim, o servidor responde fornecendo um certificado SSL (que é armazenado em sua keyStore)

  3. Agora, o cliente recebe o certificado SSL e o verifica via trustStore (ou seja, o trustStore do cliente já possui um conjunto predefinido de certificados nos quais confia.). É como: Posso confiar neste servidor? É o mesmo servidor com quem estou tentando conversar? Nenhum homem do meio ataca?

  4. Uma vez, o cliente verifica se está conversando com o servidor em que confia e a comunicação SSL pode ocorrer através de uma chave secreta compartilhada.

Nota: Não estou falando aqui nada sobre autenticação de cliente no lado do servidor. Se um servidor também desejar fazer uma autenticação de cliente, ele também manterá um trustStore para verificar o cliente.

Balaji Boggaram Ramanarayan
fonte
25

Não há diferença entre os arquivos keystore e truststore. Ambos são arquivos no formato de arquivo JKS proprietário. A distinção está no uso: Segundo meu conhecimento, o Java usará apenas o armazenamento referenciado pela -Djavax.net.ssl.trustStorepropriedade do sistema para procurar por certificados confiáveis ​​quando criar conexões SSL. O mesmo para chaves e -Djavax.net.ssl.keyStore. Mas, em teoria, é bom usar um e o mesmo arquivo para lojas confiáveis ​​e de chave.

musiKk
fonte
4
Você pode usar diferentes tipos de keystore (por exemplo, PKCS12), definindo as propriedades do sistema javax.net.ssl.keyStoreTypee javax.net.ssl.trustStoreType.
Donal Fellows
1
@Donal: Boa adição. Você sabe se existe uma lista de todos os contêineres suportados? Eu só conheço o PKCS12 e o JKS (o primeiro é o resultado de tentativa e erro ...).
musikk
2
os formatos de keystore variam de acordo com os provedores disponíveis (consulte esta lista para aqueles incluídos no pacote Oracle JRE por padrão). Houve também uma discussão nesta questão . Outros provedores (por exemplo, BouncyCastle) podem ser usados ​​para outros formatos.
de Bruno
21

O keystore é usado por um servidor para armazenar chaves privadas e o Truststore é usado por um cliente de terceiros para armazenar chaves públicas fornecidas pelo servidor para acessar. Eu fiz isso no meu aplicativo de produção. Abaixo estão as etapas para gerar certificados java para comunicação SSL:

  1. Gere um certificado usando o comando keygen no Windows:

keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950

  1. Autocertificação do certificado:

keytool -selfcert -alias mycert -keystore server.keystore -validity 3950

  1. Exportar certificado para a pasta:

keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer

  1. Importar certificado para o armazenamento confiável do cliente:

keytool -importcert -alias mycert -file mycert.cer -keystore truststore

Akash5288
fonte
Olá, tenho um cenário em que tenho dois aplicativos diferentes no mesmo contêiner (tomcat). Nos dois aplicativos, tenho que chamar os pontos de extremidade restantes de ambos os lados para cada aplicativo. Como, de A para B e B para A (A e B são as duas aplicações). Preciso usar o armazenamento confiável neste cenário? Como eu estou usando o cliente de descanso personalizado que está usando o keystore. Por favor sugira.
Deepak
0

Estas são as etapas para criar um armazenamento confiável em sua máquina local usando o Keytool. Etapas para criar armazenamento confiável para um URL em sua máquina local.

1) Pressione o URL no navegador usando chrome

2) Verifique o "i" ícone à esquerda da URL no chrome e clique nele

3) Verifique a opção de certificado e clique nela e uma caixa de diálogo será aberta

4) verifique na guia "caminho do certificado" o número de certificados disponíveis para criar o armazenamento confiável

5) Vá para o "details" tab -> click"Copy to File" -> Give the path and the name for the certificate você deseja criar.

6) Verifique se possui certificados pai e siga o ponto "5" .

7) Após a criação de todos os certificados, abra o Prompt de Comando e navegue até o caminho em que você criou os certificados.

8) forneça o comando Keytool abaixo para adicionar os certificados e criar um armazenamento confiável.

Sample: 
   keytool -import -alias abcdefg -file abcdefg.cer -keystore cacerts
        where "abcdefg" is the alias name and "abcdefg.cer" is the actual certificate name and "cacerts" is the truststore name

9) Forneça o comando keytool para todos os certificados e adicione-os ao armazenamento confiável.

    keytool -list -v -keystore cacerts
Ganesh Sha
fonte
-1

o keystore simplesmente armazena chaves privadas, enquanto o armazenamento confiável armazena chaves públicas. Você deseja gerar um certificado java para comunicação SSL. Você pode usar um comando keygen no Windows, esta provavelmente será a solução mais fácil.

Equipe END_TECH
fonte
Um armazenamento confiável armazena certificados
Marquês de Lorne
-1

Em termos mais simples:

O keystore é usado para armazenar sua credencial (servidor ou cliente) enquanto o armazenamento confiável armazenamento é usado para armazenar outras credenciais (Certificados da CA).

O keystore é necessário quando você estiver configurando o servidor no SSL, ele é usado para armazenar o certificado de identidade do servidor, que servidor apresentará a um cliente na conexão enquanto a configuração do armazenamento confiável no lado do cliente deve conter para fazer a conexão funcionar. Se o seu navegador se conectar a qualquer site por SSL, ele verifica o certificado apresentado pelo servidor em seu armazenamento confiável.

Snehal Masne
fonte