Tipo de keystore: qual usar?

115

Olhando para o arquivo java.securitymy 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?

Mickael Marrache
fonte
4
Desde o Java 9, PKCS12 é o tipo de keystore padrão. Essa mudança visa ao objetivo do JEP 229: "Melhorar a segurança. O PKCS12 oferece algoritmos criptográficos mais fortes do que o JKS." Para obter mais informações, consulte "JEP 229: Criar keystores PKCS12 por padrão", openjdk.java.net/jeps/229 ; último acesso em 2 de fevereiro de 2018.
buzz3791

Respostas:

142

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) e PKCS12(para arquivos PKCS # 12, geralmente com extensão .p12ou à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 ( keytoolnã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 PKCS12tipo diretamente. É possível converter formatos, mas raramente é necessário se você puder escolher o tipo de armazenamento de chave diretamente.

No Java 7, PKCS12era ú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, JKSnã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 PKCS12lojas. (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.
Bruno
fonte
7
@husayt, os certificados PEM não são diretamente suportados como tipos de armazenamento de chaves (suponho que alguém possa escrever uma KeyStoreimplementaçã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 um CertificateFactory(conforme mostrado nesta resposta ).
Bruno
acho JKSque mudou paraJCEKS
anfibiente
5
De maneira crítica, um armazenamento de chaves JKS não pode armazenar chaves secretas. Para este caso de uso, JCEKS é apropriado. Pode valer a pena mencionar isso em sua resposta.
Duncan Jones
1
Está bem. No Java 8, posso criar um keystore PKCS # 12 com um único certificado sem nenhum problema. Observe que, para P12, as entradas de certificado são implicitamente confiáveis. Se você precisar de certificados não confiáveis, pode ser necessário reverter para um esquema com vários armazenamentos de chaves.
Maarten Bodewes
2
OK, pelo menos para armazenamentos de chaves Java 8 PKCS # 12 ainda não é possível armazenar entradas de chaves secretas . Você obterá uma exceção de ponteiro nulo ao armazenar esse armazenamento de chaves (ugh), provavelmente porque ele não pode encontrar certificados associados. Alguém aparentemente ignorou os ensinamentos de Josué sobre o código de falha rápida.
Maarten Bodewes
22

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:

JKS, Java Key Store. Você pode encontrar esse arquivo em sun.security.provider.JavaKeyStore. Este keystore é específico do Java, geralmente tem uma extensão de jks. Este tipo de armazenamento de chaves pode conter chaves privadas e certificados, mas não pode ser usado para armazenar chaves secretas. Por ser um keystore específico do Java, não pode ser usado em outras linguagens de programação.

JCEKS, armazenamento de chaves JCE. Você pode encontrar esse arquivo em com.sun.crypto.provider.JceKeyStore. Este keystore tem uma extensão de jceks. As entradas que podem ser colocadas no armazenamento de chaves JCEKS são chaves privadas, chaves secretas e certificados.

PKCS12, este é um tipo de keystore padrão que pode ser usado em Java e outras linguagens. Você pode encontrar essa implementação de keystore em sun.security.pkcs12.PKCS12KeyStore. Geralmente tem uma extensão de p12 ou pfx. Você pode armazenar chaves privadas, chaves secretas e certificados neste tipo.

PKCS11, este é um tipo de armazenamento de chave de hardware. Ele serve uma interface para a biblioteca Java para se conectar com dispositivos de armazenamento de chave de hardware, como Luna, nCipher. Você pode encontrar essa implementação em sun.security.pkcs11.P11KeyStore. Ao carregar o keystore, você não precisa criar um provedor específico com configuração específica. Este armazenamento de chaves pode armazenar chaves privadas, chaves secretas e certificados. Ao carregar o keystore, as entradas serão recuperadas do keystore e então convertidas em entradas de software.

PixelsTech
fonte
@ peci1 Planejei escrever alguns tutoriais sobre como usar esses keystores. Até agora eu escrevi um post para JKS, por favor, encontre-o em pixelstech.net/article/…
PixelsTech
@PixelsTech Eu encontrei este aqui e queria saber onde estão os outros :) Então, ficarei ligado;) Obrigado
Martin Pecka
1
@ peci1 Cobri JCEKS e PKCS12 hoje. Para PKCS11, envolve hardware e configuração extra, precisa de mais tempo para compor. pixelstech.net/article/… e pixelstech.net/article/…
PixelsTech
Uau, isso é uma velocidade da luz! Muito obrigado.
Martin Pecka
5

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 JKSe JCEKSsão:

  • Chaves secretas, chaves privadas e certificados podem ser armazenados
  • PKCS12é um formato padrão, pode ser lido por outros programas e bibliotecas 1
  • Segurança aprimorada: JKSe JCEKSsã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, 3

1 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:

Marcono1234
fonte