Certificados SSL para desarrolladores Java

seguridad

seguridad


Seguro que en alguno de tus desarrollos en Java te has tenido que enfrentar con certificados para conectarte a terceros o con securizar tu aplicación. Hoy en refactorizando traemos una guía de certificados SSL para desarrolladores Java que te ayudar en tus aplicaciones y a entender mejor su funcionamiento.

¿Qué es una conexión https?

Una de las partes más importantes en internet es la seguridad, es crear un entorno seguro entre cliente y servidor, en el cual el cliente pueda confiar en el servidor.

Ante este panorama de establecer conexiones seguras aparece el protocolo https (Hyper Text Transfer Protocol Secure), en el cual se necesita un certificado SSL y crea un canal cifrado entre el cliente y el servidor.

Este sistema funciona con el sistema de clave pública y clave privada, en el que el servidor crea un certificado de clave pública que se encuentra firmado por una autoridad de certificación. Así, de este modo, cuando una web es segura, veremos un candado en la que el navegador nos dirá que esa web es segura.

La clave pública y la privada se encuentran unidas, es decir, no se puede utilizar una sin la otra. Por ejemplo para enviar un mensaje cifrado a un servidor, lo tengo que cifrar con su clave pública para que pueda descifrarlo con su clave privada.

Https funcionamiento | Guía de Certificados SSL para desarrolladores Java
Https funcionamiento

¿Qué es un certificado SSL?

Un certificado SSL es aquel componente que nos va a permitir crear una conexión segura entre cliente y servidor.

Los certificados SSL se componen de una clave privada y de una clave pública, ambas tendrán que funcionar de manera conjunta para poder establecer una conexión segura. Para la creación de un certificado tenemos dos maneras, generar un certificado auto firmado o generar un certificado firmado por una autoridad, vamos a ver ambos casos a continuación.

Certificado auto firmado

Como la misma palabra indica un certificado auto firmado, es aquel firmado por uno mismo. Esto quiere decir, que no ha sido firmado por ninguna autoridad conocida (CA), sino por el servidor que aloja el certificado. Estos certificados son llamados en inglés self-signed.

Este tipo de certificados, te permitirán conectarte por https, pero al no estar firmado por una autoridad que se encuentre almacenada en tu navegador, el propio navegador te dará un aviso de que puede ser peligroso.

Más abajo veremos como generar un certificado de este tipo.

Certificados firmados por una autoridad

A diferencia de los certificados anteriores, este tipo de certificados serán generados para ser firmados por una autoridad conocida. Esta autoridad o CA, puede ser de tu organización, por lo que solo funcionaría a nivel local, o puede ser una autoridad conocida a nivel mundial con lo que podrás navegar desde internet de manera segura.

Recuerda, este tipo de seguridad es la necesaria en la web y aparecerá un candado cuando sea segura en la url de tu navegador.

¿Cómo se gestionan los certificados usando Java?

Cuando nos encontramos trabajando con Java, los conceptos que tendremos que conocer sobre los certificados serán, el truststore, el keystore y el keytool que nos ayudará a la generación de los certificados.

El formato de los certificados que se ha usado hasta la llegada de Java 8 fue en JKS, a partir de Java 9 ese formato ha cambiado y PKCS12 ha sido el formato por defecto a utilizar. La principal diferencia entre estos formatos es que JKS es única para Java y PKCS12 es un formato más estándar.

Java trustore

Este va a ser un almacén que contiene certificados para identificar a terceros. Estos certificados se van a usar para poder confiar con el tercero con el que nos vamos a comunicar.

Por ejemplo, si nosotros como cliente, estamos hablando con un servidor a través de una conexión https, el servidor nos mostrará la clave pública y el certificado. Entonces en ese momento, nosotros buscaremos en nuestro almacén de confianza (truststore), el certificado o las autoridades de certificación, sino estuvieran habría un error de handshake.

Java KeyStore

Un almacén de claves en Java se encarga de guardar todas las entradas de claves privadas y certificados con claves públicas. Cada uno de los que guarda se almacenará con un alias, por lo que podemos tener tantos como queramos siempre identificados por ese alias.

Como hemos comentado anteriormente, usaremos un almacén de claves o keystore, cuando queramos establecer una conexión HTTPS. En el momento en el que se quiere establecer la conexión, el servidor buscará la clave privada que tiene guardada en el keystore, y presentará la clave pública y el certificado al cliente que le ha solicitado la conexión. También existe la autenticación mutua (MTLS) , y en este caso el cliente también tendrá su keystore y presentará su certificado y clave pública.

Java Keytool

Keytool es una herramienta que se encuentra con el JRE y se encarga de gestionar y crear pares de claves y certificados. Y nos permitirá almacenar claves y certificados en el keystore.

Ejemplos de generación de certificados usando Keytool

Creación de un certificado self-signed con keytool

Imagínate que tenemos un entorno de desarrollo en el que tenemos comunicación entre nuestros servicios, el primer paso será crear un certificado para poder establecer comunicación entre los diferentes servicios:

keytool -genkeypair -alias <alias> -keypass <keypass> -validity <validity> -keystore <keystore> -storetype <storetype> -storepass <storepass> 

Para la creación del certificado vamos a hacer uso de -genkeypair con las siguientes opciones:

  • alias: El alias del certificado que vamos a crear y que se guardará en el keystore con ese alias.
  • keypass: La clave del certificado que vamos a crear.
  • validity: Duración y tiempo de validez del certificado
  • storepass: Storepass es usado para proteger la integridad del keystore, es la contraseña del keystore.
  • storetype: Tipo de certificado PKCS12 o JKS.
  • keystore: Puedes especificar el nombre y la ubicación del certificado que vas a crear
keytool -genkeypair -alias refactorizando-cert -keypass 123456 -validity 256 -storetype PKCS12  -keystore keystore.p12 -storepass 123456

Este comando ha creado la clave privada y su correspondiente clave pública, que se almacenará en el keystore. La hemos creado para una validez de 256 días y lo hemos guardado con nombre keystore.p12 en la misma ruta en la que se ha creado.

Si queremos listar los certificados que tenemos en nuestro almacen podemos hacer:

keytool -list -keystore $JAVA_HOME/lib/security/cacerts

Certificado firmado por una CA

Si lo queremos trabajar con un certificado firmado por una CA, lo primero será crear una solicitud de firma de certificado (Certificate signing request CSR):

keytool -certreq -alias keyPairRefactorizando -storetype PKCS12 \
-keystore refactorizando_keystore.p12 -file -rfc -storepass changeit > refactorizando_certificate.csr

Este fichero se enviará a una autoridad para que lo firme, una vez firmado lo recibiremos en formato X.509. Esta clave pública estará ahora firmada por una autoridad y podrá ser entregada al cliente.

Añadir certificados al truststore

Si necesitamos añadir un certificado a nuestro truststore que se encuentra firmado por una CA, para poder conectarnos de manera segura con terceros, vamos a utilizar el siguiente comando:

keytool -import -trustcacerts -file [certificate] -alias [alias] -keystore $JAVA_HOME/lib/security/cacerts

Importar un certificado al keystore

Si necesitas importar un certificado al keystore, puedes usar el siguiente comando

$ keytool -import -alias <alias> -file <file> -keystore <keystore>

Conclusión

En esta entrada de Guía de Certificados SSL para desarrolladores Java, hemos visto como podemos crear certificados para establecer conexiones seguras en nuestras aplicaciones Java haciendo uso de keytool. En muchas ocasiones en una tarea un poco tediosa, pero es necesaria e imprescindible entender su funcionamiento para poder aplicarlo.

Si tienes alguna duda o sugerencia puedes contactar o quieres mantenerte al día con nuestros artículos, síguenos en Facebook pulsando aquí.

Otros artículos que te pueden interesar

Entity Graph con JPA en Spring Boot

Primeros pasos con Micronaut

Orquestación Vs Coreografía en Microservicios


1 pensamiento sobre “Certificados SSL para desarrolladores Java

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *