Java keytool - Herramienta para Manejar Claves y Certificados


Mediante keytool podemos manejar un almacenamiento de claves y certificados, llamado keystore, con el que podemos asignarlo a un servidor y autentifique un servicio. Con esta herramienta podemos crear tanto claves como solicitudes de certificados y certificados autofirmados, como importar claves y certificados.
Todos se guarda mediante un alias que asocia las claves y los certificados en el keystore y el cual, al indicar en un servicio el keystore donde se encuentra nuestros certificados, podemos indicarle cual coger para ser más exactos y así poder tener distintos certificados para distintos servicios en un mismo keystore.

Indíce

  • Comandos de Keytool
  • Autofirmar un certificado
  • Firmar un certificado con autoridad certificadora

Comandos de keytool

En cualquier momento, si tenemos dudas de alguna opción del comando o queremos saber que otras opciones tenemos al poner una opción, nos ayudaremos de la típica ayuda del comando:
keytool -help    ||    keytool -opción -help

Con la ayuda nos encontraremos lo siguiente:
 -certreq            Genera una solicitud de certificado
 -changealias        Cambia el alias de un certificado/clave en nuestro keystore
 -delete             Borra un certificado/llave
 -exportcert         Exporta un certificado
 -genkeypair         Genera un par de clave
 -genseckey          Genera una clave secreta
 -gencert            Genera un certificado para una solicitud de certificado
 -importcert         Importa un certificado
 -importpass         Importa una contraseña
 -importkeystore     Importa entrada/s de un keystore
 -keypasswd          Cambia la contraseña de una clave
 -list               Lista las entradas de un keystore
 -printcert          Muestra el contenido de un certificado
 -printcertreq       Muestra el contenido de una solicitud de certificado
 -printcrl           Muestra el contenido de un archivo CRL
 -storepasswd        Cambia la contraseña de un keystore

Aparte de estas opciones contamos con distintas opciones que se usan dependiendo de la opción elegida. En el caso de generar algo podríamos utilizar, entre otras, las siguientes opciones:
 -alias "nombreAlias"          Nombre del alias con el que se guardará el certificado/clave en el keystore
 -keyalg "DSA"/"DES"           Algoritmo con el que se generará la clave
 -keysize 1024/56/168          Tamaño especificado para cada clave
 -validity                     Duración de la validez de un certificado/clave
 -keystore nombreKeystore      Keystore en el que se guardará el certificado/clave
 -file nombreArchivo           Fichero en el que se guardará el certificado/clave
 -protected true/false         Propiedad con la que indicamos si el keystore está protegido o no
Nota: Es recomendable que a la hora de usar alguna opción principal compruebes mediante la ayuda que opciones se pueden usar para realizar el comando.

Autofirmar un certificado

Esto ya viene explicado en distintos sitios:

Firmar un certificado con autoridad certificadora

Para utilizar en Tomcat un certificado firmado, necesitamos guardarlo en un keystore.
Necesitamos crear un par de claves y un certificado firmado por una autoridad certificadora junto con el propio certificado de la CA. Esto lo podemos hacer con OpenSSL pero hay que tener en cuenta que es posible que si usamos un explorador Chrome nos podría fallar aunque todo funcionase. Puedes ayudarte con esto.
Con la clave, el certificado y la autoridad certificadora, creamos un formato que empaqueta nuestro certificado y clave privada y los conecta con la autoridad certificadora. Para ello utilizamos el siguiente comando:
openssl pkcs12 -export -out server.p12 -in server.crt -inkey server.key -chain -CAfile CA.crt
Nota: Es importante que si el server está firmado por CA, los archivos con los que se intenta crear el PKCS12 sean los mismos

Con nuestro pkcs ya podemos importarlo en un keystore, el cual se utilizará para verificar nuestros servicios en Tomcat.
keytool -importkeystore -srckeystore server.p12 -destkeystore keystore.jks -srcstoretype pkcs12
Si comprobamos el contenido encontraremos una sola entrada con un alias puesto por defecto, en principio sería 1 si no tiene nada, y guarda el pkcs directamente. Cuando en el server.xml indicamos la dirección del keystore, este cogerá el pkcs y al cargar el servicio saldrá autentificado con la autoridad certificadora.