Loja de Confiança vs Key Store – criando com keytool

Eu entendo que o keystore usaria chaves privadas / públicas e as chaves públicas do truststore (e representa a lista de partes confiáveis ​​com as quais você pretende se comunicar). Bem, esta é minha primeira suposição, então se isso não estiver correto, eu provavelmente não comecei muito bem …

Eu estava interessado em entender como / quando você distingue as lojas ao usar o keytool.

Então, 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 que eu confio bob, mas não está claro para mim se isso criou um arquivo keystore ou um arquivo de truststore? Eu posso configurar meu aplicativo para usar o arquivo como qualquer um.

 -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") definido, posso ver o certificado sob 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 através de uma conexão SSL para Bob (mas talvez seja melhor deixar para outra pergunta!).

Quaisquer indicações ou esclarecimentos seriam muito apreciados. A saída do keytool é a mesma que você importa e sua única convenção diz que um é um keystore e o outro é um truststore? Qual é o relacionamento ao usar SSL, etc?

A terminologia é um pouco confusa, mas tanto javax.net.ssl.keyStore e javax.net.ssl.trustStore são usados ​​para especificar quais keystores usar, para duas finalidades diferentes. Os keystores vêm em vários formatos e nem são necessariamente arquivos (veja esta questão ), e o keytool é apenas uma ferramenta para executar várias operações neles (import / export / list / …).

Os parâmetros TrustManager e TrustManager são os parâmetros padrão usados ​​para construir TrustManager e TrustManager (respectivamente), usados ​​para construir um SSLContext que contém essencialmente as configurações de SSL / TLS a serem usadas quando fazendo uma conexão SSL / TLS através de um SSLSocketFactory ou um SSLEngine . Essas propriedades do sistema são exatamente de onde vêm os valores padrão, que são usados ​​pelo SSLContext.getDefault() , usados ​​por SSLSocketFactory.getDefault() por 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 SSLContext específicos para um determinado propósito.)

A diferença entre o TrustManager e o TrustManager (e, portanto, entre javax.net.ssl.keyStore e javax.net.ssl.trustStore ) é a seguinte (citada no guia de referência da 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 devem ser enviadas ao host remoto.

(Outros parâmetros estão disponíveis e seus valores padrão são descritos no guia de referência 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 em javax.net.ssl.keyStore deve conter suas chaves privadas e certificados, enquanto o javax.net.ssl.trustStore deve conter os certificados de CA nos quais você está disposto a confiar quando uma parte remota apresenta seus certificados. certificado. Em alguns casos, eles podem ser uma e a mesma loja, embora geralmente seja uma prática melhor usar lojas distintas (especialmente quando são baseadas em arquivos).

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: javax.net.ssl.trustStore que javax.net.ssl.trustStore , o Java usará apenas a loja referenciada pelo javax.net.ssl.trustStore para procurar por certificados confiáveis ​​ao criar conexões SSL. O mesmo para chaves e javax.net.ssl.keyStore . Mas, em teoria, é bom usar um e o mesmo arquivo para trust- e keystores.

Para explicar em comum usecase / propósito ou modo leigo:

TrustStore : Como o nome indica, normalmente é usado para armazenar os certificados de entidades confiáveis. Um processo pode manter uma loja de certificados de todas as partes confiáveis ​​em quem 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 seu 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 em que ele confia.). É assim: Posso confiar neste servidor? Esse é o mesmo servidor com quem estou tentando conversar? Nenhum homem do meio ataca?

  4. Uma vez, o cliente verifica se está falando com o servidor em que ele confia e, em seguida, a comunicação SSL pode ocorrer em uma chave secreta compartilhada.

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

Keystore é usado por um servidor para armazenar chaves privadas e o armazenamento confiável é usado por um cliente de terceiros para armazenar chaves públicas fornecidas pelo servidor para access. 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-20161109 -keyalg RSA -velocidade 2048 -valididade 3950

  1. Auto-certifica o certificado:

keytool -selfcert -alias mycert-20161109 -keystore server.keystore -valididade 3950

  1. Exportar certificado para pasta:

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

  1. Importar certificado para o Truststore do cliente:

keytool -importcert -alias mycert-20161109 -arquivo C: \ certs \ mycert-20161109 -keystore .truststore

O keystore simplesmente armazena as chaves privadas, enquanto o armazenamento confiável armazena as chaves públicas. Você desejará 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.