viernes, 25 de julio de 2014

Importando certificado a la JVM

Importando un certificado a la JVM (cacerts)

Esto permite evitar configurar programaticamente el certificado

System.setProperty(SSL_TRUSTSTORE, trustStore);
System.setProperty(SSL_TRUSTSTORE_PASSWORD, trustStorePwd);

donde:
trustStore=C\:\\ejemplo.jks
trustStorePwd=

y donde
public static final String SSL_TRUSTSTORE_PASSWORD  = "javax.net.ssl.trustStorePassword";
public static final String SSL_TRUSTSTORE                      = "javax.net.ssl.trustStore";

1. Listamos los certificados importados en la JVM
Entramos a <JAVA_HOME>\jre\lib\security\

  • keytool -list -v -keystore cacerts 


2. Importamos el certificado descargado desde el sitio HTTPS al cacerts de la JVM

  • keytool -importcert -alias "TEST_CERT" -file e:\\pepe.cer -keystore cacerts
  • password: changeit

Y si queremos generar un truestore (jks) a partir del certificado para poder utilizarlo programaticamente:

  • keytool.exe -import -file e:\pepe.cer -keystore e:\jjjjj.jks

NOTA: Si estamos ejecutando el código dentro de un jboss (es decir, tenemos alguna clase java dentro del jboss que intenta establecer una comunicacion segura con algun sitio) es factible que estas lineas (System.setProperty(..)...) no sean tenias en cuenta:

En un jboss 5.0.0.GA: Va a tomar en cuenta las lineas System.setProperty(...) sin problemas, con lo cual, programaticamente podemos setear el certificado y la conexion segura se establecera.

En un jboss 5.1.0.GA: Nunca va a tomar en cuenta las lineas System.setProperty(...), con lo cual, programaticamente NO podemos setear el certificado. Tenemos que agregarlo via configuracion del jboss como explicamos mas abajo.

***************************************************
IMPORTANTISIMO: Cuando se crea el keystore tiene que tener CN=localhost, sino esta como localhost no anda!
***************************************************


Importando varios certificados a un keystore (para no depender de la JVM en caso de futuros upgrades)

# Import VeriSign root certificate

  • keytool -import -v -keystore my.truststore -alias VeriSign_Root -storepass changeit -file VeriSign,Inc..crt


# Import VeriSign intermediate certificate

  • keytool -import -v -keystore my.truststore -alias VeriSignIntermediateCACert -storepass changeit -file VeriSignIntermediateCACert.txt


# Import server certificate

  • keytool -import -v -keystore my.truststore -alias server_cert -storepass changeit -file cert.cer


# List trust store certificates

  • keytool -list -v -keystore my.truststore


y en caso de querer levantar este keystore (certificado) generado previamente via configuracion del JBOSS

De esta manera, no es necesario setear programaticamente nada:

En jboss 5.1.0.GA:

Edit bin/run.conf

# Set trust store file location
JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStore=c://server//jboss-5.0.0.GA_ConHTTPS_Activado//server//default//conf//demottrust.jks"
# Set trust store password
JAVA_OPTS="$JAVA_OPTS -Djavax.net.ssl.trustStorePassword=password"
# Turn off host verification if needed
#JAVA_OPTS="$JAVA_OPTS -Dorg.jboss.security.ignoreHttpsHost=true"
# Turn on ssl handshake debugging if needed
#JAVA_OPTS="$JAVA_OPTS -Djavax.net.debug=ssl,handshake"

En jboss 5.0.0.GA

Edit bin/run.bat (no me tomaba el run,conf)

# Set trust store file location
set JAVA_OPTS=%JAVA_OPTS% -Djavax.net.ssl.trustStore=c:\server\jboss-5.0.0.GA_ConHTTPS_Activado\server\default\conf\demottrust.jks
# Set trust store password

set JAVA_OPTS=%JAVA_OPTS% -Djavax.net.ssl.trustStorePassword=changeit

Nota: para esta version de jboss va sin comillas

Ver: http://jianmingli.com/wp/?p=975

Es importante entender que de esta manera, no hace falta agregar programáticamente ningún comando para levantar el certificado en la JVM y asi establecer la conexión segura (HTTPS).