#!/intro
No ecossistema Java, os keystores desempenham um papel fundamental no armazenamento de ativos criptográficos. Servem como repositórios seguros para armazenar chaves privadas, certificados e, nalguns casos, chaves simétricas. Estes são essenciais em aplicações que utilizam SSL/TLS, assinatura digital, autenticação mútua e outros mecanismos de segurança.
> keystore_vs_truststore
Apesar de frequentemente confundidos, keystores e truststores têm papéis distintos dentro do ecossistema de segurança em Java. Um keystore armazena chaves privadas e os respetivos certificados, normalmente utilizados para autenticar a aplicação ou servidor. Um truststore, por outro lado, contém apenas certificados de terceiros confiáveis, geralmente autoridades certificadoras (CA). Embora possam partilhar o mesmo formato de ficheiro, é prática recomendada mantê-los separados por razões de segurança e gestão.
Seguem os comandos essenciais para criar e gerir keystores utilizando a ferramenta keytool.
> criar_keystores
Alguns exemplos da criação de keystores nos vários formatos suportados.
>> criar_keystores / JKS
Exemplo de criação de keystore no formato JKS. Frequentemente ainda o padrão em muitos frameworks Java. Descontinuado em 2017 devido à sua segurança insuficiente.
keytool -genkeypair \
-alias o-meu-id \
-keyalg RSA \
-keysize 2048 \
-keystore keystore.jks \
-validity 365
-genkeypair: Gera um par de chaves (privada + pública).-alias: Identificador do par de chaves dentro do keystore.-keyalg: Algoritmo da chave (pode ser RSA, EC, etc).-keysize: Tamanho da chave.-keystore: Nome do keystore.-validity: Validade do certificado gerado (em dias).
>> criar_keystores / JCEKS
Geração de keystore no formato JCEKS. Um formato historicamente usado como melhoria do JKS, mas com limitações de segurança conhecidas. Não recomendado para novas aplicações.
keytool -genkeypair \
-alias o-meu-id \
-keyalg RSA \
-keysize 2048 \
-keystore keystore.jceks \
-storetype JCEKS -validity 365 \
-storepass a-minha-palavra-passe \
-noprompt
-storetype: Formato do keystore.-storepass: Palavra-passe de acesso ao keystore.-noprompt: evita confirmação interativa (útil para automatização).
>> criar_keystores / PKCS#12
Exemplo de criação de keystore no formato PKCS#12. Uma alternativa melhor do que os formatos mais antigos. Pode não oferecer segurança adequada com as configurações por defeito. É fundamental assegurar a utilização de algoritmos fortes (ex.: AES, PBKDF2, HMAC).
keytool -genkeypair \
-alias o-meu-id \
-keyalg RSA \
-keysize 4096 \
-keystore keystore.p12 \
-storetype PKCS12 \
-validity 365
>> criar_keystores / bouncycastle
Criação de keystores usando a biblioteca Bouncy Castle como provider alternativo ao padrão do Java. Útil em ambientes que requerem formatos adicionais ou conformidade com normas de segurança FIPS.
>>> criar_keystores / bouncycastle / BKS
Criação de keystore no formato BKS através do Bouncy Castle. Ainda usado em dispositivos móveis e sistemas embebidos.
keytool -genkeypair \
-alias o-meu-id \
-keyalg RSA \
-keysize 2048 -keystore keystore.bks \
-storetype BKS \
-providerclass org.bouncycastle.jce.provider.BouncyCastleProvider \
-providerpath bcprov-jdk15on.jar \
-validity 365
>> criar_keystores / bouncycastle / BCFKS
Geração de keystore no formato BCFKS com Bouncy Castle em modo FIPS, para ambientes que requerem conformidade com standards de segurança rigorosos.
keytool -genkeypair \
-alias o-meu-id \
-keyalg RSA \
-keysize 2048 \
-keystore keystore.bcfks \
-storetype BCFKS \
-providerclass org.bouncycastle.jcajce.provider.BouncyCastleFipsProvider \
-providerpath bcfips.jar \
-validity 365
> listar
Comandos para listar o conteúdo de um keystore, incluindo detalhes sobre cada entrada, como validade, tipo e certificados associados.
keytool -list -v -keystore keystore.jks
Mostra detalhes completos de uma entrada específica.
keytool -list -v -alias meu-alias -keystore keystore.jks
> exportar
Como exportar um certificado contido num keystore, permitindo partilhá-lo ou integrá-lo noutros sistemas.
keytool -exportcert \
-alias o-meu-id \
-keystore keystore.jks \
-file meu-cert.cer -rfc
-alias: Identificador do certificado dentro do keystore.-file: Ficheiro de saída.-rfc: Grava o certificado no formato Base64 (PEM).
> importar
Processos para importar certificados e keystores existentes, incluindo a conversão de ficheiros com chaves privadas (ex.: .p12, .pfx) para um formato suportado pelo keytool.
keytool -importcert -alias autoridade-cert \
-file ca-cert.cer \
-keystore keystore.jks
Importar um ficheiro .P12 ou .PFX com a chave privada e certificado:
O keytool não suporta diretamente a importação de chaves privadas. É necessário utilizar o OpenSSL para combinar os ficheiros e convertê-los para PKCS#12.
keytool -importkeystore \
-srckeystore certificado.p12 \
-srcstoretype PKCS12 \
-destkeystore keystore.jks \
-deststoretype JKS \
-deststorepass palavra-passe-strore \
-destkeypass palavra-passe-chave \
-alias o-meu-id
-srckeystore: Nome do ficheiro contendo os ativos criptográficos.-srcstorepass: Palavra-passe do keystore de origem.-destkeystore: Nome do keystore de destino.-deststorepass: Palavra-passe do keystore de destino.-destkeypass: Palavra-passe da chave privada no keystore.
> converter
Conversão de keystores entre formatos distintos, garantindo compatibilidade com diferentes ferramentas ou requisitos técnicos.
>> JKS_to_PKCS12
Conversão de um keystore JKS para o formato PKCS12.
keytool -importkeystore \
-srckeystore keystore.jks \
-srcstoretype JKS \
-destkeystore keystore.p12 \
-deststoretype PKCS12
>> PKCS12_to_JKS
Conversão inversa, de PKCS12 para JKS, caso necessário por razões de compatibilidade.
keytool -importkeystore \
-srckeystore keystore.p12 \
-srcstoretype PKCS12 \
-destkeystore keystore.jks \
-deststoretype JKS
> remover
Remoção de entradas específicas de um keystore com base no identificador (alias), útil para manutenção e rotação de certificados.
keytool -delete \
-alias o-meu-id \
-keystore keystore.jks
> conclusão
A ferramenta keytool é um recurso fundamental para a gestão de identidades e segurança em ambientes Java.
Para garantir uma utilização eficaz e segura, e mitigar o risco de compromissão por acesso não autorizado, recomenda-se a utilização de palavras-passe fortes e únicas para cada keystore.
A adopção do formato PKCS12 é particularmente indicada quando se exige interoperabilidade com plataformas que não utilizam Java de forma nativa.
A atribuição de aliases deve ser feita com critério, evitando duplicações ou sobreposições de função. Cada alias deve estar associado a um propósito bem definido, devidamente documentado. Esta documentação deve incluir o tipo de chave ou certificado, o contexto de utilização, o responsável pela sua gestão e a data de expiração ou renovação prevista.
A manutenção de um inventário criptográfico actualizado e bem estruturado não só facilita a auditoria como também contribui para uma governação eficaz dos activos associados à segurança da informação.
> status: secured
> exit 0