Pular para o conteúdo principal

Configurando o Certbot


Sobre o Certbot

O Certbot é uma ferramenta gratuita e de código aberto que automatiza o processo de obtenção e renovação de certificados SSL/TLS para sites. Ele foi desenvolvido pela Electronic Frontier Foundation (EFF) e ajuda a proteger a comunicação entre o servidor web e os visitantes do site, garantindo a criptografia das informações transmitidas. O Certbot é compatível com diversos provedores de hospedagem e sistemas operacionais, e pode ser executado através da linha de comando ou de uma interface gráfica de usuário, tornando a configuração do SSL/TLS acessível mesmo para usuários com menos experiência técnica.

Criando o serviço no Docker

Para que o serviço do certbot seja criado no Docker, é preciso colocar a seguinte definição no docker-compose.yml:

version: '3'
services:
nginx:
image: nginx:1.15-alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./data/nginx:/etc/nginx/conf.d
certbot:
image: certbot/certbot

Para que as requisições sejam direcionadas para o servidor de produção através do HTTPS é necessário criar um arquivo em /data/nginx com o nome de app.conf com as seguintes definições:

server {
listen 80;
server_name endereco_do_server.com.br;

location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443 ssl;
server_name endereco_do_server.com.br;

location / {
proxy_pass http://endereco_do_server.com.br;
}
}

Se você tentar executar o comando docker compose up agora, o container do nginx vai falhar pois não possui nenhum certificado configurado. Precisamos fazer alguns ajustes.

Relacionando o NGINX com o certbot

O Let's Encrypt realiza a validação de domínio solicitando uma URL conhecida do domínio. Se ele receber uma resposta específica (o "desafio"), o domínio será considerado validado. Isso é semelhante ao processo pelo qual o Google Search Console verifica a propriedade de um site. Os dados de resposta são fornecidos pelo Certbot, portanto, é necessário encontrar um modo para que o contêiner nginx possa servir arquivos do Certbot.

Em primeiro lugar, precisamos de dois volumes compartilhados do Docker: um para os desafios de validação e outro para os certificados propriamente ditos.

Adicione esses volumes à lista de volumes da seção do nginx no arquivo docker-compose.yml.

- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot

É necessário adicionar o código abaixo em volumes da seção do certbot:

volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot

Agora podemos fazer o nginx processar os arquivos de acme-challenge com a seguinte configuração no arquivo app.conf.

location /.well-known/acme-challenge/ {
root /var/www/certbot;
}

Depois disso, vamos referênciar os arquivos de certificados HTTPS. Adicione o certificado a ser criado em breve e sua chave privada na segunda seção do servidor (porta 443). Certifique-se de substituir o http://endereco_do_server.com.br pelo nome do seu domínio.

ssl_certificate /etc/letsencrypt/live/example.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.org/privkey.pem;

Agora vem a parte complicada. Precisamos que o nginx execute a validação do Let's Encrypt, mas o nginx não iniciará se os certificados estiverem faltando.

Então, o que devemos fazer? Criar um certificado fictício, iniciar o nginx, excluir o certificado fictício e solicitar os certificados reais. Felizmente, você não precisa fazer tudo isso manualmente, existe um script conveniente para isso.

Baixe o script para seu diretório de trabalho com o nome init-letsencrypt.sh:

curl -L https://raw.githubusercontent.com/wmnnd/nginx-certbot/master/init-letsencrypt.sh > init-letsencrypt.sh

Edite o script para adicionar seu(s) domínio(s) e seu endereço de e-mail. Se você alterou os diretórios dos volumes compartilhados do Docker, certifique-se de ajustar também a variável data_path.

Em seguida, execute chmod +x init-letsencrypt.sh e sudo ./init-letsencrypt.sh.

Renovação automática de certificado.

Por último, mas não menos importante, precisamos garantir que nosso certificado seja renovado quando estiver prestes a expirar. A imagem certbot não faz isso automaticamente, mas podemos mudar isso!

Adicione ao parâmetro entrypoint na seção de certbot do docker-compose.yml o seguinte valor:

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

Isso faz com que o nginx recarregue sua configuração (e certificados) a cada seis horas em segundo plano e inicie o nginx em primeiro plano.

Tudo está pronto agora. Os certificados iniciais foram obtidos e nossos contêineres estão prontos para serem iniciados. Basta executar docker-compose up e desfrutar do seu site ou aplicativo seguro por HTTPS.