Spring Boot com certificado SSL gerado pelo Let`s Encrypt e utilizando Nginx como servidor Web
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:
-
Um servidor Ubuntu na versão 20.04
-
Um nome de domínio registrado. Para este tutorial utilizaremos o dominio blog-exemplo.com como exemplo.
-
Ambos os registros de DNS a seguir devem estar configurados para o seu servidor.
-
Um registro A com blog-exemplo.com deve ser apontado para o endereço de IP público do seu servidor.
-
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.