Sirviendo HTTPS desde Spring Boot 2 sobre Nginx

Conseguir el certificado

En este artículo asumimos que ya estás usando Certbot, de Letsencrypt para gestionar tus certificados HTTPS (si no es así, puedes encontrar algunos tutoriales en los recursos). Esto significa que puedes encontrar una ruta en tu servidor similar a la siguiente:

/etc/letsencrypt/live/mydomain.com

Nuestra aplicación Spring Boot necesita certificados en formato PKCS2. Lo que haremos será crear un keystore para almacenarlos. Y este keystore usará una contraseña, que deberemos proveer a nuestra applicación de Spring Boot 2. Deberás encontrar una forma segura de gestionar dicha contraseña (en este ejemplo por simplicidad utilizaremos las propiedades de la applicación).

cd /etc/letsencrypt/live/mydomain.com

El valor que escribamos en el parámetro -name será el alias de la clave en el keystore.

openssl pkcs12 -export -in fullchain.pem \
-inkey privkey.pem \
-out keystore.p12 \
-name mydomainkeyalias \
-CAfile chain.pem \
-caname root


Si planeas incluir este comando en el hook de despliegue de Certbot también querrás incluir la contraseña en el comando. Puedes conseguirlo usando la opción -passout:on:

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem \
-out keystore.p12 \
-passout pass:keystorepassword \
-name mydomainkeyalias \
-CAfile chain.pem \
-caname root

Spring Boot 2

En cuanto a la aplicación de Spring Boot, necesitaremos configurar unas cuantas propiedades para el HTTPS.

Nginx

Edita la configuración de Nginx para tu dominio para reflejar los últimos cambios.

Primero, deberás asegurarte de que tu primer bloque <server> no contiene listen 80. Si este es el caso todas las peticiones HTTP serían consumidas y servidas por este primer bloque, y no es lo que queremos.

Certbot debería haber añadido unas pocas cosas a la configuración, y asumimos que las peticiones al puerto 443 ssl ya están siendo atendidas correctamente.

Añadimos un segundo bloque server para tratar las peticiones HTTP puerto 80, y redirigir al HTTPS puerto 443 mediante una respuesta 301.

Tu configuración final debe ser más o menos así:

Y una vez hemos terminado necesitaremos recargar la configuración de nginx.

nginx -s reload

Tras este último paso todas las peticiones deberían redirigir automáticamente a su versión HTTPS, y todas las urls servidas por tu aplicación Spring Boot 2 deberían reconocerse como un sitio web seguro en tu navegador.

Client: .

Tagged under: https, nginx, Spring Boot 2, Spring, Spring Boot, Letsencrypt, certificado, http, seguro

Visit Project