SSLmentor

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

Lego & ACME WildCard

Lego & ACME WildCard

Cliente ACME Lego - WildCard SSL

Um guia detalhado para implementar um certificado SSL WildCard em estrela através do cliente ACME Lego e da validação API DNS com o alojamento web VEDOS. O procedimento destina-se a certificados do tipo example.com e *.example.com, em que a renovação deve ser automática sem introduzir manualmente os registos TXT. O guia utiliza um certificado ACME da autoridade de certificação Certum. O certificado utilizado serve apenas como exemplo – o princípio de funcionamento e o procedimento de implementação ACME são os mesmos para todas as autoridades de certificação.

O guia utiliza sintaxe verificada no Lego 5.2.2. O Lego v5 alterou alguns parâmetros em comparação com versões mais antigas, pelo que, em caso de erro como flag provided but not defined, verifique a sintaxe correta utilizando lego accounts register --help, lego run --help ou lego --help.

Conceitos básicos

  • ACME – protocolo para emissão e renovação automatizadas de certificados SSL/TLS.
  • Lego – um cliente ACME escrito em Go. Pode realizar validação DNS através de muitos fornecedores de DNS (lista de fornecedores de DNS suportados).
  • DNS-01 – validação através do registo DNS TXT _acme-challenge. É necessária para certificados WildCard.
  • EAB kid + hmac – detalhes External Account Binding (EAB) da autoridade de certificação. Ligam o Certbot a uma conta ou produto.
  • VEDOS WAPI – a interface API do VEDOS através da qual o Lego cria e elimina os registos DNS TXT.
  • Systemd service - um ficheiro de configuração que indica ao sistema Linux como iniciar uma aplicação e mantê-la em execução mesmo após um reinício do servidor.

Em todos os exemplos apresentados, substitua o domínio example.com pelo seu próprio domínio.

Instalação do Lego

apt update
apt install -y curl tar

cd /tmp
LEGO_URL=$(curl -s https://api.github.com/repos/go-acme/lego/releases/latest | sed -n 's/.*"browser_download_url": "\(.*linux_amd64.tar.gz\)".*/\1/p' | head -n1)
echo "$LEGO_URL"
curl -L -o lego.tar.gz "$LEGO_URL"
tar -xzf lego.tar.gz
install -m 0755 lego /usr/local/bin/lego
lego --version

Após uma instalação bem-sucedida, recomendamos remover os ficheiros temporários.

rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
Comando / valor O que faz / o que substituir
apt update Atualiza a lista de pacotes.
apt install -y curl tar Instala as ferramentas para descarregar e extrair o Lego.
LEGO_URL=... Encontra o URL do pacote de versão Linux amd64 mais recente.
curl -L -o lego.tar.gz Descarrega o arquivo do Lego.
tar -xzf lego.tar.gz Extrai o arquivo.
install -m 0755 lego /usr/local/bin/lego Instala o Lego como um comando de sistema executável.
lego --version Verifica a versão instalada do Lego.

Fornecedor de DNS API

Este guia utiliza a DNS API do registador de domínios Vedos, que oferece uma API para gerir o DNS dos domínios registados. Para o alojamento web Vedos, precisa de ativar o WAPI e também preencher os endereços IP permitidos e a palavra-passe WAPI.

O cliente LEGO suporta centenas de outros fornecedores de DNS.
Pode encontrar a sua lista no site do LEGO - lista de fornecedores de DNS suportados.

Endereços IP do servidor VPS

curl -4 ifconfig.me
curl -6 ifconfig.me
Comando / valor O que faz / o que substituir
curl -4 ifconfig.me Mostra o endereço IPv4 público do servidor, que precisa de ser permitido no VEDOS WAPI.
curl -6 ifconfig.me Mostra o endereço IPv6 público do servidor, se o VPS utilizar um. É aconselhável permitir também este endereço no VEDOS WAPI.

No campo Endereços IP permitidos, introduza todos os endereços IP de saída do seu servidor, normalmente tanto IPv4 como IPv6. Os valores são separados por um espaço. O VEDOS permite pedidos à API apenas a partir dos endereços IP indicados.
Importante: Se permitir apenas IPv4 e algum pedido à API sair através de IPv6, a emissão do certificado pode ser bem-sucedida, mas a limpeza dos registos TXT falhará com o erro Access not allowed from this IP address.

Valores recomendados para o fornecedor de DNS VEDOS

Campo Valor recomendado
Ativar WAPI Ligado
Endereços IP permitidos O endereço IPv4 público do VPS e, possivelmente, o IPv6
Método de notificação Fila POLL
Protocolo preferido JSON
Palavra-passe A palavra-passe WAPI gerada, não a palavra-passe de administração habitual

Apache, webroot

A configuração básica do Apache é uma parte de apoio. A validação DNS ocorre através da DNS API, não através de HTTP, mas o vhost do Apache é necessário para servir o website depois de o certificado ser emitido.

›› Mostrar/Ocultar secção

Antes de executar, substitua o valor example.com na linha DOMAIN="example.com" pelo seu próprio domínio sem o asterisco. A variável $DOMAIN é depois utilizada nos comandos seguintes para os caminhos, o vhost do Apache e a página de teste.

cd /var/www
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2

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
Comando / valor O que faz / o que substituir
cd /var/www Muda para o diretório onde os ficheiros web são normalmente armazenados.
apt update Atualiza a lista de pacotes.
apt install -y apache2 Instala o Apache; o -y confirma automaticamente a instalação.
systemctl enable --now apache2 Ativa o Apache no arranque do servidor e inicia-o ao mesmo tempo.
a2enmod rewrite headers ssl Ativa os módulos para redirecionamentos, cabeçalhos e HTTPS.
DOMAIN="example.com" Define a variável do domínio. Substitua example.com pelo seu próprio domínio.
mkdir/chown/chmod/echo Cria o webroot, define as permissões para o Apache e guarda uma página de teste simples.

Vhost HTTP tanto para o apex como para os subdomínios:


cat > /etc/apache2/sites-available/$DOMAIN.conf <<EOF
<VirtualHost *:80>
    ServerName $DOMAIN
    ServerAlias *.$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
Comando / valor O que faz / o que substituir
cat > ... <<EOF Escreve um novo vhost HTTP do Apache num ficheiro em sites-available.
ServerName $DOMAIN O domínio principal do virtual host.
ServerAlias *.$DOMAIN Permite o tratamento de qualquer subdomínio de primeiro nível.
DocumentRoot O diretório a partir do qual o Apache serve o conteúdo.
a2ensite $DOMAIN.conf Ativa o vhost.
apache2ctl configtest Verifica a sintaxe da configuração do Apache.
curl -I http://$DOMAIN Verifica a resposta HTTP do domínio.

Ficheiros de configuração do Lego

A abordagem recomendada para o Lego v5 é armazenar as definições num ficheiro de configuração. O systemd service não precisa então de conter um comando longo com domínios, o fornecedor de DNS e hooks.

Ficheiro de configuração .env

O ficheiro .env é um ficheiro de configuração de texto no qual são armazenadas variáveis de ambiente, por exemplo credenciais de acesso, chaves de API ou definições da aplicação. Para maior clareza, pode nomear o ficheiro provider-domain.env. O ficheiro vedos-example.com.env conterá as credenciais de início de sessão do VEDOS WAPI, pelo que o armazenamos em /etc/lego e lhe atribuímos permissões restritas.

DOMAIN="example.com"

mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
Comando / valor O que faz / o que substituir
DOMAIN="example.com" Define o domínio para os comandos seguintes. Substitua pelo seu próprio domínio.
mkdir -p /etc/lego/$DOMAIN Cria o diretório para os dados e a configuração do Lego do domínio indicado.
nano /etc/lego/vedos-$DOMAIN.env Abre o ficheiro para as variáveis da API do VEDOS.

Na configuração abaixo, substitua WEDOS_LOGIN pelo seu login do VEDOS e WEDOS_WAPI_PASSWORD pela palavra-passe gerada no VEDOS WAPI. Pode deixar os valores de timeout e interval como estão.

WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
Comando / valor O que faz / o que substituir
WEDOS_USERNAME O login do VEDOS da conta que gere a zona DNS.
WEDOS_WAPI_PASSWORD A palavra-passe WAPI gerada na administração do VEDOS.
WEDOS_PROPAGATION_TIMEOUT O tempo máximo de espera pela propagação de DNS em segundos.
WEDOS_POLLING_INTERVAL O intervalo entre verificações da propagação de DNS.
WEDOS_TTL O TTL dos registos TXT criados para o desafio ACME.
chmod 600 /etc/lego/vedos-$DOMAIN.env

Ficheiro de configuração lego.yml

O ficheiro .yml é um ficheiro de configuração de texto em formato YAML, utilizado para uma notação clara de definições, parâmetros e dados estruturados. Antes de guardar a configuração YAML, substitua example.com pelo seu próprio domínio, *.example.com pelo nome wildcard, vas@email.cz pelo seu e-mail de contacto e os valores KID / HMAC pelos detalhes da sua encomenda de certificado ACME. Nomes como certum-example ou example-com-wildcard são etiquetas internas; pode deixá-los, mas com vários domínios é aconselhável renomeá-los de acordo com o domínio.

mkdir /etc/lego/$DOMAIN
nano /etc/lego/$DOMAIN/lego.yml
storage: /etc/lego/example.com

accounts:
  certum-example:
    server: certum
    email: vas@email.cz
    acceptsTermsOfService: true
    eab:
      kid: KID
      hmacKey: HMAC

servers:
  certum:
    url: https://acme.certum.pl/directory

challenges:
  vedos-dns:
    dns:
      provider: vedos
      envFile: /etc/lego/vedos-example-com.env
      resolvers:
        - 1.1.1.1:53

certificates:
  example-com-wildcard:
    account: certum-example
    challenge: vedos-dns
    domains:
      - example.com
      - "*.example.com"
    renew:
      days: 30

hooks:
  deploy:
    command: systemctl reload apache2
Comando / valor O que faz / o que substituir
storage Diretório para a conta do Lego, os certificados e os metadados.
accounts Definição da conta ACME, incluindo o e-mail e os detalhes EAB.
servers.certum.url O endpoint ACME da Certum.
challenges.vedos-dns Validação DNS-01 através do fornecedor VEDOS.
envFile O ficheiro com as credenciais de início de sessão da API do VEDOS.
certificates Lista de certificados que o Lego deve gerir.
domains O domínio apex e o domínio wildcard no certificado.
renew.days Quantos dias antes da expiração o Lego deve renovar.
hooks.deploy.command Comando após uma emissão ou renovação bem-sucedida, aqui o recarregamento do Apache.
chmod 600 /etc/lego/$DOMAIN/lego.yml

O ficheiro lego.yml contém o EAB HMAC, pelo que tem de ter permissões restritas. Na documentação para clientes, utilize apenas marcadores de posição.

Emissão do certificado

Antes de executar, substitua example.com no caminho pelo domínio que utilizou ao criar o diretório. A primeira execução cria a conta ACME, define os registos DNS TXT através da DNS API, realiza a validação DNS-01 e guarda o certificado.

lego --config /etc/lego/$DOMAIN/lego.yml

Durante a espera, o Lego pode imprimir:

dns01: waiting for record propagation timeout=1h0m0s interval=30s
Comando / valor O que faz / o que substituir
lego --config Executa o Lego de acordo com o ficheiro de configuração. Na primeira execução emite o certificado, nas execuções seguintes trata da renovação.
dns01: waiting for record propagation O Lego criou o registo TXT e está a aguardar até que fique visível no DNS.
timeout=1h0m0s Aguarda no máximo uma hora.
interval=30s Verifica o DNS a cada 30 segundos.

Isto significa que o Lego verifica o DNS a cada 30 segundos e aguarda no máximo 1 hora. Após o sucesso, verifique os ficheiros:

ls -la /etc/lego/$DOMAIN/certificates/

O diretório certificates/ contém o .crt emitido, o .key, os certificados intermédios da autoridade de certificação e os metadados.

Procedimento CLI alternativo para o Lego v5

›› Mostrar/Ocultar secção

Se não utilizar um ficheiro de configuração, no Lego v5 o EAB é introduzido durante o registo da conta. Antes de executar, substitua example.com pelo seu próprio domínio, vas@email.cz pelo seu próprio e-mail e KID / HMAC pelos valores da sua encomenda.

lego accounts register \
  --path /etc/lego/example.com \
  --server https://acme.certum.pl/directory \
  --email vas@email.cz \
  --accept-tos \
  --eab \
  --eab.kid 'KID' \
  --eab.hmac 'HMAC'
Comando / valor O que faz / o que substituir
lego accounts register Regista a conta ACME manualmente através da CLI sem o lego.yml.
--path Diretório para a conta e os certificados.
--server Endpoint ACME da Certum.
--email E-mail de contacto.
--accept-tos Concordância com os termos de serviço.
--eab Ativa o External Account Binding.
--eab.kid / --eab.hmac Detalhes EAB do CertManager.

Listagem das contas. No caminho, utilize novamente o mesmo domínio do comando anterior:

lego accounts list --path /etc/lego/example.com

Emissão do certificado agora sem parâmetros EAB. Substitua example.com pelo seu próprio domínio e *.example.com pelo nome wildcard.

set -a
. /etc/lego/vedos-example.com.env
set +a

lego run \
  --path /etc/lego/example.com \
  --server https://acme.certum.pl/directory \
  --email vas@email.cz \
  --dns vedos \
  --dns.resolvers 1.1.1.1:53 \
  --domains example.com \
  --domains '*.example.com'
Comando / valor O que faz / o que substituir
set -a Exporta automaticamente as variáveis carregadas do ficheiro.
. /etc/lego/vedos-example.com.env Carrega as variáveis da API do VEDOS para a shell atual.
set +a Desativa a exportação automática das variáveis.
lego run Emite ou renova o certificado sem um ficheiro de configuração.
--dns vedos Utiliza a DNS API.
--domains Os domínios que estarão no certificado.

Implementar o certificado no Apache

Antes de criar o vhost HTTPS, substitua example.com pelo seu próprio domínio no nome do ficheiro, nos valores ServerName e ServerAlias, nos caminhos do webroot e nos caminhos do certificado. Estes caminhos têm de corresponder ao domínio utilizado na configuração do Lego.


cat > /etc/apache2/sites-available/example.com-le-ssl.conf <<'EOF'
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName example.com
    ServerAlias *.example.com

    DocumentRoot /var/www/example.com/public
    <Directory /var/www/example.com/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /etc/lego/example.com/certificates/example.com.crt
    SSLCertificateKeyFile /etc/lego/example.com/certificates/example.com.key

    ErrorLog ${APACHE_LOG_DIR}/example.com_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/example.com_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF

a2ensite example.com-le-ssl.conf
apache2ctl configtest
systemctl reload apache2

curl -I https://example.com
curl -I https://test.example.com
Comando / valor O que faz / o que substituir
cat > ...-le-ssl.conf Cria o vhost HTTPS do Apache.
ServerName / ServerAlias Especifica o domínio apex e os subdomínios wildcard.
SSLCertificateFile Caminho para o certificado do Lego.
SSLCertificateKeyFile Caminho para a chave privada do Lego.
a2ensite Ativa o vhost HTTPS.
systemctl reload apache2 Recarrega a nova configuração do Apache.
curl -I https://... Verifica a resposta HTTPS.

Renovação automática

O Lego pode renovar o certificado, mas após a instalação não cria por si próprio um systemd timer. A execução regular é configurada através de um serviço e timer personalizados. Antes de inserir, substitua example-com no nome do service/timer pelo seu próprio nome seguro sem pontos, por exemplo mojedomena-cz, e substitua example.com no caminho da configuração pelo seu próprio domínio.


cat > /etc/systemd/system/lego-example-com-renew.service <<'EOF'
[Unit]
Description=Renew Certum WildCard SSL for example.com using Lego and VEDOS DNS
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/lego --config /etc/lego/example.com/lego.yml
EOF

cat > /etc/systemd/system/lego-example-com-renew.timer <<'EOF'
[Unit]
Description=Daily Lego renewal check for example.com

[Timer]
OnCalendar=*-*-* 03:20:00
RandomizedDelaySec=1800
Persistent=true

[Install]
WantedBy=timers.target
EOF

systemctl daemon-reload
systemctl enable --now lego-example-com-renew.timer
systemctl list-timers | grep lego
Comando / valor O que faz / o que substituir
lego-example-com-renew.service Systemd service para uma execução única do Lego renew/run.
Type=oneshot O serviço inicia, executa a sua tarefa e termina.
ExecStart Executa o Lego de acordo com o lego.yml.
lego-example-com-renew.timer Systemd timer que executa o serviço regularmente.
OnCalendar Hora da verificação diária.
RandomizedDelaySec Atraso aleatório para que os pedidos não comecem todos exatamente ao mesmo tempo.
Persistent=true Executa uma execução perdida após o arranque do servidor.
systemctl enable --now Ativa o timer e ativa-o imediatamente.

Teste seguro do serviço:

systemctl start lego-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
Comando / valor O que faz / o que substituir
systemctl start ...service Executa manualmente o serviço de renovação para um teste.
journalctl -u ... Mostra os logs mais recentes do serviço.

Se o certificado não estiver perto de expirar, o Lego pode indicar que a renovação não é necessária. Este é o comportamento correto.

Erros comuns

Parâmetro desconhecido no Lego

No Lego v5 os parâmetros EAB são --eab.kid e --eab.hmac. Os parâmetros pertencem sempre a um subcomando específico.

lego accounts register --help
lego accounts list --help
lego run --help

A limpeza dos registos TXT falha num IP não permitido

Cleaning up failed ... Access not allowed from this IP address (2a02:...)

Adicione também o endereço IPv6 do servidor aos endereços IP permitidos no VEDOS WAPI. O certificado pode ser emitido corretamente, mas os registos TXT permanecerão no DNS após a validação.

Lista de verificação

dig TXT _acme-challenge.example.com +short
lego --config /etc/lego/example.com/lego.yml
systemctl status lego-example-com-renew.timer
apache2ctl configtest
curl -I https://example.com
Comando / valor O que faz / o que substituir
dig TXT Verifica os registos TXT no DNS.
lego --config Executa a configuração do Lego.
systemctl status Mostra o estado do timer.
apache2ctl configtest Verifica a configuração do Apache.
curl -I Verifica a resposta HTTPS.

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