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.
-alias
O alias da entrada do -alias
. Lembre-se do alias
pode apontar para apenas uma chave.-keyalg
O nome do algoritmo usado para gerar a chave. RSA comumente usado.-keysize
O 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.-sigalg
O algoritmo de assinatura usado para assinar um par de chaves.-dname
Nome 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.-keypass
Senha do par de chaves necessária para
acesso a esse par de chaves específico no keystore.-validity
número de dias durante os quais o certificado
anexado a um par de chaves deve ser válido.-storetype
O formato do arquivo no qual o keystore deve ser salvo. O padrão é JKS. Outra opção é o formato PKCS11.-keystore
O nome do arquivo do repositório para armazenar o par gerado
chaves. Se o arquivo não existir, ele será criado.-file
O nome do arquivo para ler ou gravar um certificado ou solicitar um certificado.-storepass
Senha do keystore, para quem quiser trabalhar
com ele, você precisa dessa senha. A diferença entre keypass
e keypass
em
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.-rfc
Se 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.-providerName
O 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.-providerClass
O 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.-providerArg
Argumentos passados para o próprio provedor criptográfico durante a inicialização (se necessário pelo provedor).-v
Abreviação de verboso, o Keytool imprimirá muitas informações adicionais na linha de comando em um formato legível.-protected
Determina 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.-Jjavaoption
sequência de opções para a Java VM que gera um par de chaves e cria armazenamento.