Keystore JKS: Crear contendores de certificados / claves JKS con soporte SHA512
Loc contenedores (keystores) son ficheros que hacen la función de repositorio de certificados, los cuales pueden contener certificados, claves, certificados con claves y otro tipo de datos / ficheros / objetos, todo depende del formato del contenedor utilizado.
Tipos de contenedores más populares.
- JKS Java KeyStore (Oracle's KeyStore format).
- JCEKS Java Cryptography Extension KeyStore (More secure version of JKS).
- PKCS #12 Public-Key Cryptography Standards #12 KeyStore (RSA's KeyStore format).
- BKS Bouncy Castle KeyStore (Bouncy Castle's version of JKS).
- UBER Bouncy Castle UBER KeyStore (More secure version of BKS).
Uno muy común al usar openssl es “pkcs12”, el cual se define como un formato de archivo de almacenamiento para objetos criptográficos. Se utiliza comúnmente para agrupar una clave privada con su certificado X.509 o para agrupar todos los miembros de una cadena de confianza.
Cada keystore tiene sus limitaciones, por ejemplo pkcs12 solo soporta los siguientes tipos de algoritmos criptográficos a la hora de cifrar una clave.
- 128 bit RC4 with SHA1
- 40 bit RC4 with SHA1
- 3 key triple DES with SHA1 (168 bits)
- 2 key triple DES with SHA1 (112 bits)
- 128 bit RC2 with SHA1
- 40 bit RC2 with SHA1
De querer utilizar el algoritmo SHA512 para firmar un documento, este contenedor no sería una opción viable. Si por ejemplo se utiliza JSignPdf para firmar documentos PDF y utilizamos un keystore del tipo pkcs12, nunca se podrá usar un algoritmo de firma superior a SHA1 por mucho que se le indique a JSignPdf que firme utilizando SHA512.
Vamos a ver a continuación qué herramienta nos puede facilitar la creación de contenedores y como crear desde la linea de comandos un contenedor JKS (soportado por JSignPdf) y almacenar dentro una clave privada y certificado. (JKS soporta SHA512 y anteriores).
KeyStore-explorer (Windows , MAC y Linux): http://keystore-explorer.sourceforge.net/specifications.php
KeyStore-explorer (Java) facilita de forma gráfica la creación de varios tipos de contenedores y además permite consultar estado de certificados de diferentes tipos, no requiere más que java como dependencia. También tiene opciones interesantes como importar partes de los certificados, cambiar la clave del contenedor o averiguar de qué tipo es, una herramienta muy recomendada para lidiar con este tipo de ficheros.
Crear un keystore JKS desde la linea de comandos para contener una clave privada + certificado.
Descargar (binario y código fuente): ImportKey.
La clave privada y el certificado deben estar en formato DER y no PEM.
openssl pkcs8 -topk8 -nocrypt -in key.pem -inform PEM -out key.der -outform DER openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER
Generar en el home del usuario un fichero llamado “keystore.ImportKey”, el alias para dicha entrada en el keystore será en este caso “CA_amazon”. (Alias si no se especifica y password: importkey)
java ImportKey cakey.der cacert.der CA_amazon
NOTA: Para cambiar la clave se recomienda el uso de keytool o bien KeyStore-explorer.
Enlace de interés: http://www.agentbob.info/agentbob/79-AB.html