Trust Store vs Key Store-creating with keytool
eu entendo que o teclado normalmente teria chaves privadas/públicas e a loja de confiança apenas Chaves Públicas (e representa a lista de partes confiáveis com as quais você pretende se comunicar). Bem, essa é a minha primeira suposição, então se isso não está correto, provavelmente não comecei muito bem...
eu estava interessado em entender como / quando você distingue as lojas ao usar keytool.
Até agora, criei uma série de teclas usando {[[6]}keytool -import -alias bob -file bob.crt -keystore keystore.ks
que cria a minha chave-mestra.ficheiro ks. Eu respondo {[[2]} à pergunta eu confio em bob, mas não é claro para mim se isso criou um arquivo keystore ou um arquivo 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, consigo ver o certificado sob certificações de confiança (mas não sob a secção Keystone). O certificado particular que estou importando tem apenas uma chave pública e eu pretendo usá-lo para enviar coisas sobre uma conexão SSL para Bob (mas talvez seja melhor deixar para outra pergunta!).
5 answers
A terminologia é um pouco confusa de facto, mas tanto {[[0]} como javax.net.ssl.trustStore
são usados para especificar quais os keystores a usar, para dois fins diferentes. Os Keystores vêm em vários formatos e não são necessariamente arquivos (veja esta pergunta ), e keytool
é apenas uma ferramenta para realizar várias operações neles (importar/exportar/list/...).
Os parâmetros javax.net.ssl.keyStore
e javax.net.ssl.trustStore
são os parâmetros predefinidos usados para construir KeyManager
s e TrustManager
s (respectivamente), depois usados para construir um SSLContext
que contém essencialmente a configuração SSL/TLS a usar ao fazer uma ligação SSL / TLS através de um SSLSocketFactory
ou um SSLEngine
. Estas propriedades do sistema são exatamente de onde os valores padrão vêm, que é então usado por SSLContext.getDefault()
, ele mesmo usado por SSLSocketFactory.getDefault()
, por exemplo. (Tudo isso pode ser personalizado através da API em um número de lugares, se você não quiser usar os valores padrão e que específico SSLContext
s para um determinado propósito.)
A diferença entre KeyManager
e TrustManager
(e, portanto, entre javax.net.ssl.keyStore
e javax.net.ssl.trustStore
é a seguinte: segue (citado no Guia de Referência JSSE):
Gestor de confiança: determina se o credenciais de autenticação remota (e assim, a conexão) deve ser fidedigno.
KeyManager: determina qual credenciais de autenticação para onde enviar o anfitrião remoto.
(outros parâmetros estão disponíveis e os seus valores por defeito estão descritos no Guia JSSE ref. Note que, embora exista um valor padrão para o trust store, não há nenhuma para a loja de chaves.)
Essencialmente, o teclado em {[[0]} deve conter as suas chaves e certificados privados, enquanto que o {[1] } deve conter os certificados de AC em que está disposto a confiar quando uma parte remota apresentar o seu certificado. Em alguns casos, eles podem ser uma e a mesma loja, embora muitas vezes é melhor prática de usar lojas distintas (especialmente quando eles são baseados em arquivos).
Não há diferença entre arquivos keystore e truststore. Ambos são arquivos no formato de arquivo JKS proprietário. A distinção está no uso: tanto quanto sei, Java só irá usar a loja que é referenciada por javax.net.ssl.trustStore
para procurar certificados em quem confiar ao criar conexões SSL. O mesmo para as chaves e javax.net.ssl.keyStore
. Mas em teoria é bom usar um e o mesmo arquivo para confiança - e keystores.
Para explicar de forma comum:
Durante o aperto de mão SSL,Trustore: Como o nome indica, é normalmente utilizado para armazenar os certificados de Entidades de confiança. Um processo pode manter uma loja de certificados de todas as suas partes de confiança em que confia.
KeyStore : usado para guardar as chaves do servidor (tanto públicas como privadas) juntamente com a cert assinada.
Um cliente tenta acesso aos https://
E assim, o servidor responde fornecendo um certificado SSL (que é armazenado no seu teclado)
Agora, o cliente recebe o certificado SSL e verifica-o através da trustStore (ou seja, a trustStore do cliente já tem um conjunto pré-definido de certificados em que confia.). É do tipo : posso confiar neste servidor ? É o mesmo servidor com quem estou a tentar falar ? Nenhum ataque do homem do meio ?
Uma vez, o cliente verifica que é conversando com o servidor em que ele confia, então a comunicação SSL pode acontecer através de uma chave secreta compartilhada.
Keystore é usado por um servidor para armazenar chaves privadas, e truststore é usado por cliente de terceiros para armazenar chaves públicas fornecidas pelo servidor para acessar. Fiz isso na minha candidatura à produção. Abaixo estão os passos para gerar certificados java para a comunicação SSL:
- gerar um certificado usando o comando keygen no windows:
- Auto certificar o certificado:
- exportar o certificado para a pasta:
- Certificado de importação para a Loja do cliente: