Olhando para o arquivo java.security
my JRE
, vejo que o tipo de keystore a ser usado por padrão é definido como JKS
. Aqui , há uma lista dos tipos de armazenamento de chaves que podem ser usados.
Existe um tipo de keystore recomendado? Quais são os prós / contras dos diferentes tipos de keystore?
Respostas:
Existem mais alguns tipos além do que está listado na lista de nomes padrão que você vinculou. Você pode encontrar mais informações na documentação dos provedores de criptografia . Os mais comuns são certamente
JKS
(o padrão) ePKCS12
(para arquivos PKCS # 12, geralmente com extensão.p12
ou às vezes.pfx
).JKS é o mais comum se você permanecer no mundo Java. PKCS # 12 não é específico do Java, é particularmente conveniente usar certificados (com chaves privadas) com backup de um navegador ou provenientes de ferramentas baseadas em OpenSSL (
keytool
não foi capaz de converter um keystore e importar suas chaves privadas antes do Java 6 , então você teve que usar outras ferramentas).Se você já tem um arquivo PKCS # 12, geralmente é mais fácil usar o
PKCS12
tipo diretamente. É possível converter formatos, mas raramente é necessário se você puder escolher o tipo de armazenamento de chave diretamente.No Java 7,
PKCS12
era útil principalmente como um keystore, mas menos para um truststore (veja a diferença entre um keystore e um truststore ), porque você não poderia armazenar entradas de certificado sem uma chave privada. Em contraste,JKS
não exige que cada entrada seja uma entrada de chave privada, então você pode ter entradas que contenham apenas certificados, o que é útil para armazenamentos confiáveis, onde você armazena a lista de certificados confiáveis (mas você não tem o chave privada para eles).Isso mudou no Java 8, então agora você também pode ter entradas apenas de certificado nas
PKCS12
lojas. (Mais detalhes sobre essas mudanças e planos adicionais podem ser encontrados em JEP 229: Criar keystores PKCS12 por padrão .)Existem alguns outros tipos de keystore, talvez usados com menos frequência (dependendo do contexto), incluindo:
PKCS11
, para bibliotecas PKCS # 11, normalmente para acessar tokens criptográficos de hardware, mas a implementação do provedor Sun também oferece suporte a armazenamentos NSS (da Mozilla) por meio disso.BKS
, usando o provedor BouncyCastle (comumente usado para Android).Windows-MY
/Windows-ROOT
, se você deseja acessar o armazenamento de certificados do Windows diretamente.KeychainStore
, se você deseja usar o chaveiro OSX diretamente.fonte
KeyStore
implementação para esse efeito). No entanto, você pode carregá-los rapidamente em uma instância de armazenamento de chaves (normalmente JKS, o tipo padrão) na memória usando umCertificateFactory
(conforme mostrado nesta resposta ).JKS
que mudou paraJCEKS
Aqui está uma postagem que apresenta diferentes tipos de armazenamento de chaves em Java e as diferenças entre os diferentes tipos de armazenamento de chaves. http://www.pixelstech.net/article/1408345768-Different-types-of-keystore-in-Java---- Visão geral
Abaixo estão as descrições de diferentes keystores da postagem:
fonte
Se você estiver usando Java 8 ou mais recente, você definitivamente deve escolher
PKCS12
, o padrão desde Java 9 ( JEP 229 ).As vantagens em comparação com
JKS
eJCEKS
são:PKCS12
é um formato padrão, pode ser lido por outros programas e bibliotecas 1JKS
eJCEKS
são bastante inseguros. Isso pode ser visto pelo número de ferramentas para força bruta de senhas desses tipos de armazenamento de chaves, especialmente populares entre os desenvolvedores Android. 2, 31 Existe JDK-8202837 , que foi corrigido no Java 11
2 A contagem de iterações para PBE usada por todos os tipos de keystore (incluindo PKCS12) costumava ser bastante fraca ( CVE-2017-10356 ), no entanto, isso foi corrigido em 9.0.1, 8u151, 7u161 e 6u171
3 Para mais leituras:
fonte