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?
Respostas:
A terminologia é um pouco confusa, mas ambas
javax.net.ssl.keyStore
ejavax.net.ssl.trustStore
sã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 ) ekeytool
é apenas uma ferramenta para executar várias operações neles (importação / exportação / lista / ...).A
javax.net.ssl.keyStore
ejavax.net.ssl.trustStore
parâmetros são os parâmetros por defeito utilizado para construirKeyManager
s eTrustManager
s (respectivamente), em seguida, utilizada para construir umSSLContext
que contém essencialmente o SSL / TLS configurações para uso na tomada de um SSL / TLS ligação através de umSSLSocketFactory
ou umaSSLEngine
. Essas propriedades do sistema são exatamente de onde vêm os valores padrão, que são então usados por eles mesmosSSLContext.getDefault()
, porSSLSocketFactory.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 osSSLContext
s específicos para uma determinada finalidade.)A diferença entre
KeyManager
eTrustManager
(e, portanto, entrejavax.net.ssl.keyStore
ejavax.net.ssl.trustStore
) é a seguinte (citada no guia de referência do JSSE ):(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.keyStore
destina-se a conter suas chaves e certificados privados, enquanto o armazenamento de chavesjavax.net.ssl.trustStore
deve 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).fonte
$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.Para explicar de maneira comum a utilização / finalidade ou o leigo:
Durante o handshake SSL,
Um cliente tenta acessar https: //
E, assim, o servidor responde fornecendo um certificado SSL (que é armazenado em sua keyStore)
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?
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.
fonte
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.trustStore
propriedade 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.fonte
javax.net.ssl.keyStoreType
ejavax.net.ssl.trustStoreType
.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:
keytool -genkey -keystore server.keystore -alias mycert -keyalg RSA -keysize 2048 -validity 3950
keytool -selfcert -alias mycert -keystore server.keystore -validity 3950
keytool -export -alias mycert -keystore server.keystore -rfc -file mycert.cer
keytool -importcert -alias mycert -file mycert.cer -keystore truststore
fonte
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.
9) Forneça o comando keytool para todos os certificados e adicione-os ao armazenamento confiável.
fonte
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.
fonte
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.
fonte