Olá Habr! Apresento a você a tradução do 10º artigo "Java Keytool", de Jakob Jenkov, de uma série de artigos para iniciantes que desejam aprender o básico da criptografia em Java.
Sumário:
- Criptografia Java
- Cifra Java
- Messagedigest
- Mac
- Assinatura
- Par de chaves
- Keygenerator
- KeyPairGenerator
- Keystore
- Keytool
- Certificado
- CertificateFactory
- CertPath
O Java Keytool é uma ferramenta de linha de comando que pode gerar pares de chave pública / chave privada e armazená-los em um keystore . O arquivo executável do utilitário é distribuído com o Java SDK (ou JRE); portanto, se você tiver o SDK instalado, ele também será pré-instalado.
O executável é chamado keytool . Para executá-lo, abra um prompt de comando (cmd, console, shell etc.). e altere o diretório atual para o diretório bin no diretório de instalação do Java SDK. Digite keytool e pressione Enter . Você deve ver algo semelhante a este:
 C:\Program Files\Java\jdk1.8.0_111\bin>keytool Key and Certificate Management Tool Commands: -certreq Generates a certificate request -changealias Changes an entry's alias -delete Deletes an entry -exportcert Exports certificate -genkeypair Generates a key pair -genseckey Generates a secret key -gencert Generates certificate from a certificate request -importcert Imports a certificate or a certificate chain -importpass Imports a password -importkeystore Imports one or all entries from another keystore -keypasswd Changes the key password of an entry -list Lists entries in a keystore -printcert Prints the content of a certificate -printcertreq Prints the content of a certificate request -printcrl Prints the content of a CRL file -storepasswd Changes the store password of a keystore Use "keytool -command_name -help" for usage of command_name C:\Program Files\Java\jdk1.8.0_111\bin> 
Como você pode ver, o utilitário keytool suporta um conjunto de comandos para trabalhar com chaves, certificados e armazenamentos de chaves. Este guia abordará o mais comum desses comandos.
Keytool comandos do Keytool levam muitos argumentos, cuja instalação pode ser difícil de lembrar. Portanto, é recomendável que você crie vários scripts CMD ou Shell com uma sequência de comandos do Keytool . Esses scripts facilitam a reexecução de comandos e também permitem que você volte e veja como o keystore foi criado.
Geração de par de chaves
A geração de um par de chaves (chave pública / chave privada) é uma das tarefas mais comuns para as quais o utilitário Keytool é usado. O par de chaves gerado é inserido no arquivo KeyStore como um par de chaves autoassinado. Aqui está um formato de linha de comando comum para gerar um par de chaves:
 -genkeypair -alias alias -keyalg keyalg -keysize keysize -sigalg sigalg -dname dname -keypass keypass -validity valDays -storetype storetype -keystore keystore -storepass storepass -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption 
Os argumentos são explicados na seção Argumentos do Keytool. Nem todos esses argumentos são necessários e muitos são opcionais. O utilitário informará se você perdeu o argumento necessário. Aqui está um exemplo de um comando que importa um certificado para o KeyStore . Lembre-se de remover as quebras de linha ao inserir um comando na linha de comando.
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -importcert -alias testkey -keypass 123456 -storetype JKS -keystore keystore2.jks -file cert.cert -rfc -storepass abcdef 
Lista de registros do Vault
Para listar as entradas no keystore, você pode usar o comando list Abaixo está o formato para o comando list . As quebras de linha devem ser fáceis de ler. Remova as quebras de linha antes de executar o comando:
 -list -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -rfc -protected -Jjavaoption 
Aqui está um exemplo de comando da list . Lembre-se de remover quebras de linha!
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -storetype JKS -keystore keystore.jks -storepass abcdef 
Este comando listará todas as entradas neste keystore. A saída será mais ou menos assim:
 Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry testkey, 19-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 4F:4C:E2:C5:DA:36:E6:A9:93:6F:10:36:9E:E5:E8:5A:6E:F2:11:16 
Se você incluir o argumento de alias no comando list , apenas a entrada correspondente ao alias fornecido será listada. Aqui está um exemplo de comando de list com o argumento de alias :
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef 
O resultado do comando acima:
 testkey, 15-Dec-2017, PrivateKeyEntry, Certificate fingerprint (SHA1): 71:B0:6E:F1:E9:5A:E7:F5:5E:78:71:DC:08:80:47:E9:5F:F8:6D:25 
Excluir uma entrada de keystore
Também no utilitário keytool , há um comando que pode excluir uma entrada do keystore: delete . Aqui está o formato deste comando:
 -delete -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption 
Aqui está um exemplo de chamada delete . Lembre-se de remover as quebras de linha antes de começar!
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -delete -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef 
Este comando exclui a entrada do repositório com o alias testkey armazenado no arquivo keystore.jks .
Geração de solicitação de certificado
O utilitário keytool pode gerar uma solicitação de certificado usando o certreq . Uma solicitação de certificado é uma solicitação a uma autoridade de certificação (CA) para criar um certificado público para sua organização. Depois de criar uma solicitação de certificado, ela deve ser enviada à autoridade de certificação onde você deseja criar o certificado (por exemplo, Verisign, Thawte ou alguma outra autoridade de certificação). Antes de poder gerar uma solicitação de certificado para uma chave privada e um par de chaves públicas, você deve gerar essa chave privada e um par de chaves públicas no armazenamento de chaves (ou importá-lo). Como fazer isso pode ser encontrado no capítulo correspondente. Aqui está o formato do comando para gerar a solicitação de certificado. Lembre-se de remover todas as quebras de linha ao usar este comando:
 -certreq -alias alias -sigalg sigalg -file certreq_file -keypass keypass -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption 
Aqui está um exemplo do -certreq :
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -certreq -alias testkey -keypass 123456 -storetype JKS -keystore keystore.jks -storepass abcdef -file certreq.certreq 
Este comando gerará uma solicitação de certificado para uma chave armazenada com o alias testkey no arquivo keystore.jks e testkey a solicitação de certificado em um arquivo chamado certreq.certreq .
A seguir, é apresentada uma lista de argumentos keytool vários comandos do keytool . Lembre-se de que nem todas as equipes aceitam todos esses argumentos. Veja um comando específico para ver quais argumentos são necessários.
- -aliasO alias da entrada do- -alias. Lembre-se do alias
 pode apontar para apenas uma chave.
- -keyalgO nome do algoritmo usado para gerar a chave. RSA comumente usado.
- -keysizeO tamanho da chave em bits. Normalmente, os tamanhos das chaves são múltiplos. Além disso, vários algoritmos podem suportar apenas determinados tamanhos de chave predefinidos.
- -sigalgO algoritmo de assinatura usado para assinar um par de chaves.
- -dnameNome exclusivo do padrão X.500. Este nome será associado a
 um alias para esse par de chaves no keystore, também
 usado como os campos "emissor" e "assunto" no formulário autoassinado
 certificado.
- -keypassSenha do par de chaves necessária para
 acesso a esse par de chaves específico no keystore.
- -validitynúmero de dias durante os quais o certificado
 anexado a um par de chaves deve ser válido.
- -storetypeO formato do arquivo no qual o keystore deve ser salvo. O padrão é JKS. Outra opção é o formato PKCS11.
- -keystoreO nome do arquivo do repositório para armazenar o par gerado
 chaves. Se o arquivo não existir, ele será criado.
- -fileO nome do arquivo para ler ou gravar um certificado ou solicitar um certificado.
- -storepassSenha do keystore, para quem quiser trabalhar
 com ele, você precisa dessa senha. A diferença entre- keypasse- keypassem
 que o primeiro fornece acesso ao repositório e o segundo a um
 um par de chaves. Você precisará das duas senhas para acessar qualquer chave,
 armazenado em armazenamento.
- -rfcSe você ativar esse sinalizador, o utilitário usará um formato de texto em vez de um formato binário, por exemplo, para exportar ou importar certificados. Valor -Rfc
 refere-se à RFC 1421.
- -providerNameO nome do provedor de API criptográfica que você deseja usar ao criar o par de chaves. O nome do provedor deve ser especificado nos arquivos de propriedades de segurança Java.
- -providerClassO nome da classe raiz do provedor de API criptográfica que você deseja usar. Usado quando o nome do provedor não está especificado nos arquivos de propriedades de segurança Java.
- -providerArgArgumentos passados para o próprio provedor criptográfico durante a inicialização (se necessário pelo provedor).
- -vAbreviação de verboso, o Keytool imprimirá muitas informações adicionais na linha de comando em um formato legível.
- -protectedDetermina se a senha do keystore deve ser fornecida por algum mecanismo externo, por exemplo, um token de hardware. Valores válidos são verdadeiros e falsos.
- -Jjavaoptionsequência de opções para a Java VM que gera um par de chaves e cria armazenamento.