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.
Conteúdo do artigo
- Instalação do Lego
- Fornecedor de DNS API
- Ficheiros de configuração do Lego
- Emissão do certificado
- Implementação no Apache
- Renovação automática
- Erros comuns
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çãoAntes 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çãoSe 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. |
Para onde seguir?
Voltar para Ajuda
Encontrou um erro ou não entendeu algo? Escreva para nós!
