Cliente ACME Certbot
Um guia detalhado para a implementação completa de um certificado SSL DV ACME num VPS Debian (Apache) com renovação automática através do timer predefinido do Certbot. O guia descreve a implementação de um certificado DV de domínio único ou de vários domínios, por exemplo example.com e www.example.com. Para implementações padrão, recomendamos utilizar o diretório padrão do Certbot /etc/letsencrypt. Deste modo, as renovações são tratadas pelo timer predefinido do sistema certbot.timer.
Este guia não cobre certificados SSL wildcard WildCard, que requerem validação DNS e uma DNS API para renovação automática.
Conteúdo do artigo
- Conceitos básicos
- Apache, webroot
- Certbot, emissão do certificado
- Vários certificados num só servidor
- Várias contas EAB
Conceitos básicos
- ACME – Protocolo para emissão e renovação automatizadas de certificados SSL/TLS.
- Certbot – Um cliente ACME que comunica com a autoridade de certificação e pode implementar um certificado no Apache.
- kid + hmac – Credenciais External Account Binding (EAB) da autoridade de certificação. Ligam o Certbot a uma conta ou produto.
O kid e o hmac não verificam a propriedade do domínio, ligam o cliente ACME a uma conta da CA. O domínio é verificado separadamente através do desafio ACME. O hmac é um valor sensível — não o partilhe publicamente nem o armazene em guias partilhados. - http-01 – Validação do domínio através de um ficheiro temporário acessível no endereço HTTP do domínio.
- dns-01 – Validação através de registo DNS TXT. Necessária para certificados wildcard.
Nos exemplos, substitua example.com pelo seu próprio domínio.
Apache, webroot
Configuração básica do Apache e do domínio no servidor.
›› Mostrar/Ocultar secçãoCriação de um webroot separado para o domínio e uma página de teste simples. O Apache no Debian utiliza o utilizador www-data por predefinição.
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2
| Comando | O que faz |
|---|---|
apt update |
Atualiza a lista de pacotes dos repositórios do Debian. |
apt install -y apache2 |
Instala o servidor web Apache. O parâmetro -y confirma automaticamente a instalação. |
systemctl enable --now apache2 |
Ativa o Apache no arranque do servidor e inicia-o imediatamente. |
a2enmod rewrite headers ssl |
Ativa os módulos comuns do Apache para redirecionamentos, cabeçalhos e HTTPS. |
systemctl reload apache2 |
Recarrega a configuração do Apache sem reiniciar completamente o serviço. |
Preparar o webroot
DOMAIN="example.com"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
Criar um virtual host do Apache
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot /var/www/$DOMAIN/public
<Directory /var/www/$DOMAIN/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
Ativar o site do Apache e verificação HTTP
Antes de emitir o certificado, o domínio tem de responder através de HTTP. Isto é necessário para a validação ACME http-01.
a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
curl http://$DOMAIN
Instalar o Certbot + emitir um certificado
Instalação do Certbot a partir dos repositórios do Debian. O pacote python3-certbot-apache permite que o Certbot modifique a configuração do Apache, execute a validação e implemente o certificado emitido.
apt install -y certbot python3-certbot-apache
certbot --version
O Certbot suporta uma vasta gama de sistemas e servidores web. Recomendamos consultar as Instruções do Certbot para o procedimento específico do servidor web que escolheu.
Registo de conta ACME
Para emitir um certificado, precisa de ter uma conta ACME junto da autoridade de certificação. Neste guia, vamos utilizar certificados ACME da CA Certum.
Obterá as credenciais EAB (kid + hmac) nos detalhes da encomenda.
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
| Parâmetro | Significado |
|---|---|
--server |
Especifica o endpoint ACME específico. Sem este parâmetro, o Certbot utilizaria o servidor ACME predefinido. CA DigiCert: https://one.digicert.com/mpki/api/v1/acme/v2/directory CA Sectigo: https://acme.sectigo.com/v2/DV |
--email |
E-mail de contacto para a conta ACME. |
--agree-tos |
Aceitação dos termos de serviço. |
--eab-kid |
Identificador KID. |
--eab-hmac-key |
Chave secreta HMAC EAB. |
Emitir um certificado ACME
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN \
-d www.$DOMAIN
O parâmetro --cert-name é especialmente importante ao gerir vários certificados num só servidor. Cada certificado individual deve ter o seu próprio nome único.
Verificar o certificado e a renovação automática
certbot certificates
systemctl list-timers | grep certbot
certbot renew --dry-run
curl -I https://$DOMAIN
| Comando | Finalidade |
|---|---|
certbot certificates |
Mostra os certificados geridos pelo Certbot. |
systemctl list-timers | grep certbot |
Verifica se o timer de renovação automática predefinido está em execução. |
certbot renew --dry-run |
Simula a renovação do certificado sem substituir o certificado de produção. Saída correta: "all simulated renewals succeeded". |
curl -I https://$DOMAIN |
Verifica a resposta HTTPS do domínio. |
Vários certificados num só servidor
O Certbot pode gerir vários certificados no diretório padrão /etc/letsencrypt. Este modelo é o mais simples para implementações de clientes porque utiliza o certbot.timer predefinido.
- Crie um vhost Apache separado
Cada domínio deve ter o seu próprio ficheiro em /etc/apache2/sites-available/ e o seu próprio webroot. - Emita um certificado com um --cert-name único
Não utilize o mesmo nome de certificado para um certificado individual diferente. - Verifique a renovação de todos os certificados
O comando certbot renew --dry-run tem de passar para todas as entradas em /etc/letsencrypt/renewal/.
Comando de exemplo para um domínio adicional example.net:
DOMAIN="example.net"
mkdir -p /var/www/$DOMAIN/public
chown -R www-data:www-data /var/www/$DOMAIN
chmod -R 755 /var/www/$DOMAIN
echo "OK $DOMAIN" > /var/www/$DOMAIN/public/index.html
cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot /var/www/$DOMAIN/public
<Directory /var/www/$DOMAIN/public>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog \${APACHE_LOG_DIR}/${DOMAIN}_error.log
CustomLog \${APACHE_LOG_DIR}/${DOMAIN}_access.log combined
</VirtualHost>
EOF
a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN
-d www.$DOMAIN
certbot renew --dry-run
Solução alternativa para várias contas EAB
Na autoridade de certificação, cada produto pode ter os seus próprios valores EAB. Se já estiver registada uma conta ACME da CA no servidor, outro registo para o mesmo servidor ACME pode resultar num erro:
There is an existing account; registration of a duplicate account with this command is currently unsupported.
Nessa situação, mantenha-se no /etc/letsencrypt padrão, mas registe a nova conta utilizando a seguinte solução alternativa. Após a emissão, utilize o --account ACCOUNT_ID específico.
Mover temporariamente as contas existentes
ACME_ACCOUNT_DIR="/etc/letsencrypt/accounts/acme.certum.pl/directory"
BACKUP_DIR="/root/certbot-certum-accounts-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
find "$ACME_ACCOUNT_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$BACKUP_DIR"/ \;
Registar uma nova conta EAB
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
Encontrar o ID da nova conta
ls -1 "$ACME_ACCOUNT_DIR"
A saída deste comando é o novo ACCOUNT_ID. Utilize este valor ao emitir o certificado.
Restaurar as contas originais
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$ACME_ACCOUNT_DIR"/ \;
Emitir um certificado através de uma conta específica
certbot --apache \
--server https://acme.certum.pl/directory \
--account ACCOUNT_ID \
--cert-name example.net \
-d example.net \
-d www.example.net
| Por que é necessária a solução alternativa | O que resolve |
|---|---|
| O Certbot recusa registar uma conta duplicada para o mesmo servidor ACME. | Mover temporariamente as contas permite registar uma nova conta EAB. |
O /etc/letsencrypt padrão deve permanecer no servidor. |
O certbot.timer predefinido renova então todos os certificados sem um cron personalizado. |
| Cada produto da CA pode ter a sua própria ligação EAB. | O parâmetro --account força a conta da CA correta durante a emissão. |
Lista de verificação
apache2ctl configtestdevolveSyntax OK.curl -I http://example.comresponde através de HTTP.curl -I https://example.comresponde através de HTTPS.certbot certificatesmostra o certificado esperado.certbot renew --dry-runpassa sem erro.systemctl list-timers | grep certbotmostra umcertbot.timerativo.
Para onde ir a seguir?
Voltar para Ajuda
Encontrou um erro ou não entendeu algo? Escreva para nós!
