Spring Boot com certificado SSL gerado pelo Let`s Encrypt e utilizando Nginx como servidor Web

Por Gaspar Barancelli Junior em 22 de fevereiro de 2023

Antes de iniciarmos as configurações dessas ferramentas vamos a uma breve introdução sobre elas.

Let’s Encrypt

A Let’s Encrypt é uma autoridade certificadora (AC) gratuita, automatizada e aberta que opera em prol do benefício público. É um serviço provido pela Internet Security Research Group (ISRG).

Nginx

O Nginx é um servidor web open source de alta performance. Oferece recursos de balanceamento de cargas, proxy reverso e streaming, além de ser capaz de gerenciar milhares de conexões simultâneas.

Spring Boot

Spring Boot é um framework desenvolvido em Java que facilita o processo de configurações de aplicações que utilizam todo ecossistema do Spring Framework. A ideia principal desse framework é facilitar a vida dos desenvolvedores, fazendo com que não percam mais tempo configurando um projeto e sim gastem seu tempo no desenvolvimento, para isso ele faz um uso do que chamamos de auto configurações.


Para seguir este tutorial, você vai precisar dos seguintes pré-requisitos:

  1. Um servidor Ubuntu na versão 20.04

  2. Um nome de domínio registrado. Para este tutorial utilizaremos o dominio blog-exemplo.com como exemplo.

  3. Ambos os registros de DNS a seguir devem estar configurados para o seu servidor.

    1. Um registro A com blog-exemplo.com deve ser apontado para o endereço de IP público do seu servidor.

    2. Um registro A com www.blog-exemplo.com deve ser apontando para o endereço de IP público do seu servidor.

O primeiro passo é instalar o Java 15 e rodar uma aplicação Spring Boot

Vamos efetuar o download do OpenJDK 15

wget https://download.java.net/java/GA/jdk15.0.1/51f4f36ad4ef43e39d0dfdbaf6549e32/9/GPL/openjdk-15.0.1_linux-x64_bin.tar.gz

Agora vamos descompactar o arquivo.

tar -zxvf openjdk-15.0.1_linux-x64_bin.tar.gz

Desenvolvi um projeto em Spring Boot que retorna uma simples pagina web exibindo a data atual, para facilitar deixei os fontes do projeto e o artefato spring-boot-freemarker-0.0.1-SNAPSHOT.jar no github, então agora vamos fazer o download desse projeto.

git clone https://github.com/gasparbarancelli/spring-boot-freemarker.git

Podemos iniciar nossa aplicação em segundo plano, por padrão ela vai responder a porta 8080.

jdk-15.0.1/bin/java -jar spring-boot-freemarker-0.0.1-SNAPSHOT.jar & disown

Depois que nossa aplicação for executada com sucesso, podemos fazer uma chamada http para testar a resposta da requisição.

curl http://localhost:8080

O segundo passo é configurar o Nginx como nosso servidor web

Vamos atualizar a lista das versões de pacotes disponíveis e instalar o Nginx.

sudo apt update
sudo apt install nginx

Concluída instalação agora devemos alterar as regras do nosso firewall, permitindo acesso por HTTP e HTTPS.

sudo ufw allow 'Nginx HTTP'
sudo ufw allow 'Nginx HTTPS'

Agora podemos verificar o status do nosso serviço.

systemctl status nginx

Em caso de sucesso o retorno será similar ao log exibido abaixo.

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-11-10 10:44:30 UTC; 1h 2min ago
       Docs: man:nginx(8)
    Process: 53500 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
    Process: 53501 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
   Main PID: 53502 (nginx)
      Tasks: 2 (limit: 2010)
     Memory: 3.5M
     CGroup: /system.slice/nginx.service
             ├─53502 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─53503 nginx: worker process

Nov 10 10:44:29 blog-exemplo systemd[1]: Starting A high performance web server and a reverse proxy server...
Nov 10 10:44:30 blog-exemplo systemd[1]: Started A high performance web server and a reverse proxy server.

Caso contrario você pode tentar utilizar os seguintes comandos para manipular o Nginx.

# parar
sudo service nginx stop
# iniciar
sudo service nginx start
# reiniciar
sudo service nginx restart

Por fim, vamos configurar o Nginx para redirecionar as requisições para nossa aplicação do Spring Boot.

Vamos editar o seguinte arquivo de configuração do Nginx.

sudo vim /etc/nginx/sites-available/default

Dentro da tag server precisamos alterar o valor da propriedade server_name adicionando o valor do nosso domínio, e também devemos adicionar a regra de redirecionamento.

server {
       ...

        server_name blog-exemplo.com www.blog-exemplo.com;

        location / {
             proxy_pass http://localhost:8080/;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
             proxy_set_header X-Forwarded-Proto $scheme;
             proxy_set_header X-Forwarded-Port $server_port;
        }

        ...

}

Vamos reiniciar nosso serviço do Nginx para que as configurações sejam aplicadas.

sudo service nginx restart

Ao realizarmos uma requisição para o endereço www.blog-exemplo.com a requisição vai ser recebida pelo Nginx que vai ser redirecionada para o Spring Boot, retornando a data atual como no teste do passo anterior.

curl www.blog-exemplo.com

Terceiro passo é a geração do nosso certificado SSL

Então vamos a instalação e configuração do Certbot, ele será responsável por obter um certificado SSL gratuito para o Nginx.

Execute o seguinte comando para instalação do certbot e também o python3-certbot-nginx.

sudo apt install certbot python3-certbot-nginx

O Certbot possui um plug-in para o Nginx, ele é responsável por toda reconfiguração do Nginx para vincular os certificados gerados. Como parâmetro devemos informar que desejamos utilizar o plugin do nginx e também quais os domínio devem ser registrados no certificado SSL, ao executar o comando você deve digitar seu e-mail para ficar vinculado ao certificado.

sudo certbot --nginx -d blog-exemplo.com -d www.blog-exemplo.com

O retorno do comando acima deve ser similar ao seguinte log.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/blog-exemplo.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/blog-exemplo.com/privkey.pem
   Your cert will expire on 2021-02-08. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Agora com todos os certificados baixados, instalados e carregados. Acesse o site usando https:// e verifique o indicador de segurança do seu navegador. Ele deve indicar que o site está devidamente protegido, normalmente com um ícone de cadeado. Se você testar o servidor usando o SSL, receberá uma classificação A.

Por fim, vamos editar novamente o arquivo de configuração do Nginx, para que todas as requisições feitas por http sejam redirecionadas para https.

sudo vim /etc/nginx/sites-available/default

Encontre a tag server que responde a porta 80 e adicione a seguinte configuração.

server {

    ...

    if ($scheme != "https") {
       return 301 https://$host$request_uri;
    }

    ...

}

Feito isso podemos fazer com o que o Nginx recarregue as configurações.

sudo systemctl reload nginx

Agora acesse o site usando http:// e verifique que a requisição será redirecionado para o protocolo https.

// Livros recomendados relacionados ao assunto do post

// Compartilhe esse Post