Exportación de certificados java

Hace poco tuvimos la necesidad de incluir unos certificados SSL firmados por VeriSign para la navegación HTTPS en un proxy inverso Squid. El problema fue el hecho de que el cliente que lo requería había gestionado personalmente la creación y firma del certificado con una entidad certificadora internacional, la cual realizó todo el proceso con una herramienta propietaria basada en JAVA. Esto hizo que nosotros recibiéramos un fichero binario ilegible por OpenSSL, y sobre todo, por Squid.

Tras indagar un poco y averiguar que la aplicación del cliente había hecho uso de la herramienta keytool de JAVA respiré aliviado, pues suponía que seria trivial obtener los datos. Primeramente, pensando que en 20 minutos podría estar almorzando inspeccione el contenedor mediante el comando:

# keytool -list -v -keystore server_keystore

Tras introducir la contraseña adecuada, mostró que contenía una clave privada, sus características, y los certificados que dependían de dicha clave. El siguiente paso estaba claro: exportar a formatos aceptados por Squid (y Apache, de paso) el certificado y la clave. El certificado fue sencillo, bastaba con extraerlo:

# keytool -export -alias mykey -keystore keystore -file exported-der.crt

El fichero que nos devuelve es un certificado X.509 (exported-der.crt) que está en formato DER. Dado que Squid entiende de certificados en formato PEM, con OpenSSL podemos realizar la conversión. La diferencia fundamental entre DER y PEM es que el formato DER utiliza una codificación binaria mientras que el formato PEM utiliza una codificación ASCII en base 64.

# openssl x509 -out exported-pem.crt -outform pem -in exported-der.crt -inform der

Bien, todo va sobre ruedas. Ya tenemos el certificado y ahora solo falta la clave privada. Aquí es donde la cosa patina. Al parecer la herramienta keytool no tiene ninguna opción para exportar la clave privada. Tras “googlear” un buen rato encontramos bastantes soluciones, de las cuales ninguna va. Todo son programas sencillos en JAVA que leen la clave y la insertan en un fichero, pero ninguno funciona correctamente. Finalmente encuentro en un blog la herramienta ExportPrivateKey, una herramienta sencilla, con el código detallado y que, increíble… ¡funciona!

Así pues, nos lanzamos con dicha herramienta a extraer la clave privada

# java -jar ExportPrivateKey.zip {keystore_path} JKS {keystore_password} {alias} 
{target_file}

Donde los datos de entrada son los siguentes:

keystore_path: Fichero Keystore donde están los certificados y las claves
keystore_password: Contraseña para acceder al Keystore
alias: Nombre del certificado en el keystore. Si lo ponemos mal nos devolverá errores “NULLPointerExcepction”
target_file: Fichero al que queremos volcar la clave

Bueno, ya casi estamos. Ahora tan solo tenemos que procesar la clave con OpenSSL para asegurarnos que esta en el formato adecuado para Squid:

#openssl pkcs8 -inform PEM -nocrypt -in exported-pkcs8.key -out exported.key

Y ya está. En este momento tenemos un certificado y una clave privada en formato PEM que podemos usar en Squid. Parece mentira, pero no había (o no hemos encontrado) una solo página que describiera de forma clara y concisa el problema. Espero que os haya sido útil.

(Mención especial para Carlos García, que colaboró activamente en la redacción de esta entrada y en la solución del problema. La imagen es de la página de Artwork de Squid)

Comments

  1. Usa Portecle y problema resuelto

  2. Importante el parámetro -storetype del keytool, para que mediante providers sea capaz de abrir cosas distintas del JKS.

  3. Muchas gracias por el aporte, increíble utilidad. He estado peleando con dichos certificados y claves un buen tiempo.

    Al listo que habla del portecle, que sepa que no vale de nada para lo que menciona el compañero Javier Vela con ayuda de Carlos García

    Muchas gracias!

  4. Hola, estoy intentando descargar herramienta ExportPrivateKey… me puedes enviar un link. Gracias

  5. Buenas,

    Al parecer el sitio original ha desaparecido. Sin embargo, el ejecutable puedes encontrarlo aquí:

    http://coreygilmore.com/uploads/2009/06/exportprivatekey.zip

    Saludos.