El cliente solicita al servidor un recurso mediante conexión segura SSL. Envía una lista de los algoritmos de encriptación que soporta
El servidor se identifica mediante un certificado, e informa del algoritmo de encriptación más potente que pueden usar ambos.
El cliente comprueba que el certificado sea de un sitio de confianza y genera una clave de sesión, encriptada con la clave pública del certificado del servidor.
Cliente y servidor ya conocen la nueva clave simétrica. Se envían mutuamente la clave de sesión y comprueban que coincida con su copia.
A continuación veremos cómo activar ambas modalidades de SSL en WildFly.
sudo apt-get install openssl
Cambio para permitir firmar certificados
/usr/lib/ssl/openssl.conf Línea 170
basicConstraints=CA:TRUE # Antes FALSE
1. Definir un certificado de CA ficticia:
openssl req -x509 -newkey rsa:2048 -keyout selfkey.pem -out selfcert.pem -days 365
2. Importar el certificado en el almacén de confianza trust.jks :
keytool -import -trustcacerts -alias trustself -keystore trust.jks -file selfcert.pem -keyalg RSA -keypass secreto -storepass secreto
1.- Crear una petición de certificado que identifique al servidor:
openssl genrsa -out server.key 1024 #crear una clave nueva de certificado
openssl req -new -key server.key -out server.csr #crear una petición de certificado.
2.- Firmar el certificado con nuestra CA
openssl x509 -req -days 365 -in server.csr -CA selfcert.pem -CAkey selfkey.pem -set_serial 01 -out server.crt
3.- Importar el certificado en nuestro almacén de identidad
# Convertir a PKCS12
openssl pkcs12 -export -name servercert -in server.crt -inkey server.key -out keystore.p12
#finalmente importarlo en jks
keytool -importkeystore -destkeystore identity.jks -srckeystore keystore.p12 \
-srcstoretype pkcs12 -alias servercert -keypass secreto -storepass secreto
4.- Comprobar que los certificados están importados correctamente:
keytool -list -v -keystore trust.jks -storepass secreto
keytool -list -v -keystore identity.jks -storepass secreto
5.- Copiar los almacenes a la carpeta standalone/configuration
6.- Definir el realm asociado a los certificados:
<keystore path="identity.jks" relative-to="jboss.server.config.dir" keystore-password="secreto" alias="servercert" key-password="secreto"/>
7.- Definir un https-listener en el subsistema undertow :
<buffer-cache name="default"/>
<http-listener name="default" socket-binding="http"/>
<https-listener name="https" socket-binding="https" security-realm="SecureRealm"/>
Aplica a las peticiones https y management-https.
8.-Arrancar el servidor
Ya deberíamos tener SSL pero...
El navegador avisa de que no confía en nuestro certificado de servidor.
Solución: Añadir nuestra CA a las CA de confianza del navegador
Importaremos el certificado selfcert.pem
It works!
Proteger una serie de recursos mediante conexión segura:
Redireccion SSL
/*
CONFIDENTIAL
<keystore path="identity.jks" relative-to="jboss.server.config.dir"
keystore-password="secreto" alias="servercert" key-password="secreto"/>
<socket-binding https="management-https"/>
1.- Crear un certificado de cliente, firmado por nuestra CA ficticia:
openssl genrsa -out client.key 1024
openssl req -new -key client.key -out client.csr
openssl x509 -req -days 365 -in client.csr -CA selfcert.pem -set_serial 02 -CAkey selfkey.pem -out client.crt
2.- Convertir al formato PKCS12 que incluye clave pública y privada:
openssl pkcs12 -export -name clientcert -in client.crt -inkey client.key -out clientstore.p12
3.- Importar el certificado como certificado propio:
4.- Configurar autenticación en SecureRealm:
....
<truststore path="trust.jks" relative-to="jboss.server.config.dir" keystore-password="secreto"/>
5.- Requerir certificado de cliente:
El parámetro verify-client tiene tres valores posibles:
Valor | Descripción |
---|---|
NOT_REQUESTED | No solicitar certificado a cliente (valor por defecto) |
REQUESTED | Se pide certificado de cliente, pero si no se presenta se permite continuar la conexión segura. |
REQUIRED | Se requiere un certificado de cliente válido para poder establecer una conexión segura. |
<module-option name="securityDomain" value="seguridad-cert"/>
<module-option name="verifier" value="org.jboss.security.auth.certs.AnyCertVerifier"/>
<module-option name="rolesProperties" value="file:/usr/local/wildfly/standalone/configuration/roles.properties"/>
<jsse keystore-password="secreto" keystore-url="file:/usr/local/wildfly/standalone/configuration/trust.jks"
truststore-password="secreto" truststore-url="file:/usr/local/wildfly/standalone/configuration/trust.jks"/>
CN\=JoseLuis,\ OU\=jtech,\ O\=UA,\ L\=Alicante,\ ST\=Spain,\ C\=ES=rol_usuario
CLIENT-CERT
miDominio