Hola Habr! Le presento la traducción del décimo artículo "Java Keytool" de Jakob Jenkov de una serie de artículos para principiantes que desean aprender los conceptos básicos de la criptografía en Java.
Tabla de contenido:
- Criptografía Java
- Cifrado de Java
- Messagedigest
- Mac
- Firma
- Par de llaves
- Generador de claves
- KeyPairGenerator
- Keystore
- Keytool
- Certificado
- CertificateFactory
- CertPath
Java Keytool es una herramienta de línea de comandos que puede generar pares de clave pública / clave privada y almacenarlos en un almacén de claves . El archivo ejecutable de la utilidad se distribuye con el SDK de Java (o JRE), por lo tanto, si tiene instalado el SDK, también estará preinstalado.
El ejecutable se llama keytool . Para ejecutarlo, abra un símbolo del sistema (cmd, consola, shell, etc.). y cambie el directorio actual al directorio bin en el directorio de instalación de Java SDK. Escriba keytool y luego presione Enter . Deberías ver algo similar a esto:
 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 puede ver, la utilidad keytool admite un conjunto de comandos para trabajar con claves, certificados y almacenes de claves. Esta guía cubrirá el más utilizado de estos comandos.
Keytool comandos de Keytool toman muchos argumentos, cuya instalación puede ser difícil de recordar. Por lo tanto, se recomienda que cree varios scripts CMD o Shell con una secuencia de comandos Keytool . Estos scripts hacen que sea fácil volver a ejecutar comandos y también le permiten regresar y ver cómo se creó el almacén de claves.
Generación de pares de claves
Generar un par de claves (clave pública / clave privada) es una de las tareas más comunes para las que se utiliza la utilidad Keytool . El par de claves generado se inserta en el archivo KeyStore como un par de claves autofirmado . Aquí hay un formato de línea de comando común para generar un par de claves:
 -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 
Los argumentos se explican en la sección Argumentos de Keytool. No todos estos argumentos son necesarios y muchos son opcionales. La utilidad le informará si perdió el argumento requerido. Aquí hay un ejemplo de un comando que importa un certificado en KeyStore . Recuerde eliminar los saltos de línea cuando ingrese un comando en la línea 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 de bóveda
Para enumerar las entradas en el almacén de claves, puede usar el comando de list . A continuación se muestra el formato para el comando de list . Los saltos de línea están destinados a ser fáciles de leer. Elimine los saltos de línea antes de ejecutar el comando:
 -list -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -rfc -protected -Jjavaoption 
Aquí hay un ejemplo de comando de list . ¡Recuerde eliminar los saltos de línea!
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -storetype JKS -keystore keystore.jks -storepass abcdef 
Este comando enumerará todas las entradas en este almacén de claves. La salida se verá más o menos así:
 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 
Si incluye el argumento alias en el comando de list , solo se list la entrada que coincida con el alias dado. Aquí hay un ejemplo de comando de list con el argumento alias :
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -list -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef 
El resultado del comando anterior:
 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 
Eliminar una entrada del almacén de claves
También en la utilidad keytool hay un comando que puede eliminar una entrada del almacén de claves: delete . Aquí está el formato de este comando:
 -delete -alias alias -storetype storetype -keystore keystore -storepass storepass -providerName provider_name -providerClass provider_class_name -providerArg provider_arg -v -protected -Jjavaoption 
Aquí hay un ejemplo de llamar a delete . ¡Recuerde eliminar los saltos de línea antes de comenzar!
 "C:\\Program Files\Java\jdk1.8.0_111\bin\keytool" -delete -alias testkey -storetype JKS -keystore keystore.jks -storepass abcdef 
Este comando elimina la entrada del repositorio con el alias testkey almacenado en el archivo keystore.jks .
Generación de Solicitud de Certificado
La utilidad keytool puede generar una solicitud de certificado utilizando el certreq . Una solicitud de certificado es una solicitud a una autoridad de certificación (CA) para crear un certificado público para su organización. Después de crear una solicitud de certificado, debe enviarse a la autoridad de certificación donde desea crear el certificado (por ejemplo, Verisign, Thawte o alguna otra autoridad de certificación). Antes de que pueda generar una solicitud de certificado para una clave privada y un par de claves públicas, debe generar esta clave privada y un par de claves públicas en el almacén de claves (o importarla). Cómo hacerlo se puede encontrar en el capítulo correspondiente. Aquí está el formato de comando para generar la solicitud de certificado. Recuerde eliminar todos los saltos de línea cuando use 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 
Aquí hay un ejemplo del -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 generará una solicitud de certificado para una clave almacenada con la clave de testkey alias en el archivo keystore.jks y escribirá la solicitud de certificado en un archivo llamado certreq.certreq .
La siguiente es una lista de argumentos que keytool varios comandos keytool . Recuerde que no todos los equipos aceptan todos estos argumentos. Mire un comando específico para ver qué argumentos se necesitan.
- -aliasEl alias de la entrada del- -aliasde- -alias. Recuerda el alias
 puede señalar solo una clave.
- -keyalgEl nombre del algoritmo utilizado para generar la clave. RSA de uso común.
- -keysizeEl tamaño de la clave en bits. Por lo general, los tamaños de las claves son múltiples. Además, varios algoritmos solo pueden admitir ciertos tamaños de clave predefinidos.
- -sigalgEl algoritmo de firma utilizado para firmar un par de claves.
- -dnameNombre único del estándar X.500. Este nombre estará asociado con
 un alias para este par de claves en el almacén de claves, también
 utilizado como los campos "emisor" y "sujeto" en el autofirmado
 certificado
- -keypassSe requiere contraseña de par de claves para
 acceso a este par de claves en particular en el almacén de claves.
- -validitynúmero de días durante los cuales el certificado
 adjunto a un par de claves debe ser válido.
- -storetypeEl formato de archivo en el que se debe guardar el almacén de claves. El valor predeterminado es JKS. Otra opción es el formato PKCS11.
- -keystoreEl nombre del archivo de repositorio para almacenar el par generado
 llaves Si el archivo no existe, se creará.
- -fileEl nombre del archivo para leer o escribir un certificado o solicitar un certificado.
- -storepassContraseña del almacén de claves, a cualquiera que quiera trabajar
 con ella, necesitas esta contraseña. La diferencia entre- storepassy- keypassen
 que el primero proporciona acceso al repositorio, y el segundo a otro
 Un par de llaves. Necesitará ambas contraseñas para acceder a cualquier clave,
 almacenado en el almacenamiento
- -rfcSi habilita este indicador, la utilidad utilizará un formato de texto en lugar de un formato binario, por ejemplo, para exportar o importar certificados. -Rfc valor
 se refiere a RFC 1421.
- -providerNameEl nombre del proveedor de API criptográfica que desea usar al crear el par de claves. El nombre del proveedor debe especificarse en los archivos de propiedades de seguridad de Java.
- -providerClassEl nombre de la clase raíz del proveedor de API criptográfica que desea usar. Se utiliza cuando el nombre del proveedor no se especifica en los archivos de propiedades de seguridad de Java.
- -providerArgArgumentos pasados al propio proveedor criptográfico durante la inicialización (si es necesario por el proveedor).
- -vAbreviatura de detallado, Keytool imprimirá mucha información adicional en la línea de comandos en un formato legible.
- -protectedDetermina si la contraseña del almacén de claves debe ser proporcionada por algún mecanismo externo, por ejemplo, un token de hardware. Los valores válidos son verdadero y falso.
- -Jjavaoptioncadena de opciones para la máquina virtual Java que genera un par de claves y crea almacenamiento.