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.
-alias
El alias de la entrada del -alias
de -alias
. Recuerda el alias
puede señalar solo una clave.-keyalg
El nombre del algoritmo utilizado para generar la clave. RSA de uso común.-keysize
El 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.-sigalg
El algoritmo de firma utilizado para firmar un par de claves.-dname
Nombre ú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-keypass
Se requiere contraseña de par de claves para
acceso a este par de claves en particular en el almacén de claves.-validity
número de días durante los cuales el certificado
adjunto a un par de claves debe ser válido.-storetype
El 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.-keystore
El nombre del archivo de repositorio para almacenar el par generado
llaves Si el archivo no existe, se creará.-file
El nombre del archivo para leer o escribir un certificado o solicitar un certificado.-storepass
Contraseña del almacén de claves, a cualquiera que quiera trabajar
con ella, necesitas esta contraseña. La diferencia entre storepass
y keypass
en
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-rfc
Si 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.-providerName
El 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.-providerClass
El 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.-providerArg
Argumentos pasados al propio proveedor criptográfico durante la inicialización (si es necesario por el proveedor).-v
Abreviatura de detallado, Keytool imprimirá mucha información adicional en la línea de comandos en un formato legible.-protected
Determina 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.-Jjavaoption
cadena de opciones para la máquina virtual Java que genera un par de claves y crea almacenamiento.