SSLmentor

Certificados TLS/SSL de qualidade para sites e projetos de internet.

Certbot

Certbot

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.

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ção

Criaçã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 configtest devolve Syntax OK.
  • curl -I http://example.com responde através de HTTP.
  • curl -I https://example.com responde através de HTTPS.
  • certbot certificates mostra o certificado esperado.
  • certbot renew --dry-run passa sem erro.
  • systemctl list-timers | grep certbot mostra um certbot.timer ativo.

Voltar para Ajuda
Encontrou um erro ou não entendeu algo? Escreva para nós!

CA Sectigo
CA RapidSSL
CA Thawte
CA GeoTrust
CA DigiCert
CA Certum