Agregar certificado SSL a aplicación Java con Spring Boot
El objetivo de agregar un certificado SSL a nuestra aplicación en Java con Spring es que la misma corra bajo el protocolo https (por defecto todas corren en http).
Podemos lograr esto de dos maneras: utilizando un certificado autofirmado (Self-Signed Certificate) o un certificado generado por una autoridad certificante. En el primero de los casos existen infinidades de tutoriales en la web. Para este ejemplo, utilizaré un certificado ya provisto, firmado y válido para producción.
Qué necesitamos
En mi caso contaba con los siguientes tres archivos:
- certificado.pem
- certificado.crt
- certificado.key
El archivo certificado.crt no fue necesario utilizarlo ya que el mismo se encontraba integrado en el archivo certificado.pem. Este último archivo es el más completo de los tres ya que posee la clave privada, el certificado.crt (validado por una autoridad certificante) y uno o más certificados intermedios (en mi caso tenía dos).
Lo que realmente necesitamos es obtener un archivo con extensión .p12 o .jks ya que Java solo trabaja con estos dos tipos de archivos. Se recomienda trabajar con archivos .p12 debido a que estos son de alcance más general, es decir, funcionan fuera del entorno de Java.
Para obtener este archivo .p12 necesitaremos de los archivos certificado.pem y certificado.key
OpenSSL al rescate
Para generar el archivo .p12 haremos uso de OpenSSL. Lamentablemente esta herramienta no es de fácil instalación en Windows aunque aquí les dejo el método que me permitió instalarlo.
Una vez instalado el OpenSSL, debemos ejecutar el siguiente comando:
openssl pkcs12 -export -in certificado.pem -inkey certificado.key -out certificado.p12 -name certificadoAlias -passout pass:123456
El comando “openssl” no es necesario escribirlo si es que instalaron OpenSSL con el método que les adjunté
Aquí lo que estamos diciendo es que, a partir de los archivos certificado.pem y certificado.key, nos genere un archivo certificado.p12 (el nombre es a criterio). Además le asignamos un alias (certificadoAlias) y un password (123456), estos datos son a gusto nuestro y van a ser necesarios en Java.
Yendo a Java
Una vez obtenido el .p12, debemos copiarlo en src/main/resources al mismo nivel en donde tenemos nuestro application.properties
En este archivo debemos agregar las siguientes líneas de código:
server.ssl.key-store-type=PKCS12
server.ssl.key-store=classpath:certificado.p12
server.ssl.key-store-password=123456
server.ssl.key-alias=certificadoAlias
server.ssl.enabled=true
Con esto ya deberiamos poder ejecutar nuestra aplicación y tenerla corriendo bajo el protocolo https.
NOTA IMPORTANTE: Si ingresamos a https://localhost:8080 obtendremos un mensaje de que la página no es segura ya que el certificado no pudo ser verificado. Que aparezca este mensaje tiene sentido ya que el certificado solo trabaja para los dominios que este tenga asociado. Claramente localhost no es un dominio que se encuentre en la lista de permitidos de nuestro certificado. Por lo que cuando subamos nuestro aplicación a un host o servidor, debemos asegurarnos de que este tenga un nombre de dominio que el certificado pueda validar como correcto. Por ejemplo, subir nuestra aplicación a https://midominio.com:8080 en donde “midominio” corresponde a un nombre válido para nuestro certificado.
Para este ejemplo se utilizó Spring Boot 2.1.6
Si bien yo usé el puerto 8080, para https se recomienda como estándar o buena práctica utilizar el puerto 8443
Cualquier duda o comentario que tengan, por favor escribirlo y con gusto los leeré. 💻📝🙂