Client ACME Lego - WildCard SSL
Una guida dettagliata per il deployment di un certificato SSL WildCard tramite il client ACME Lego e la validazione API DNS con l'hosting web VEDOS. La procedura è destinata a certificati del tipo example.com e *.example.com, dove il rinnovo deve essere automatico senza inserire manualmente i record TXT. La guida utilizza un certificato ACME dell'autorità di certificazione Certum. Il certificato utilizzato funge solo da esempio – il principio di funzionamento e la procedura di deployment ACME sono gli stessi per tutte le autorità di certificazione.
La guida utilizza una sintassi verificata su Lego 5.2.2. Lego v5 ha modificato alcuni parametri rispetto alle versioni precedenti, quindi in caso di errore come flag provided but not defined verifica la sintassi corretta utilizzando lego accounts register --help, lego run --help o lego --help.
Contenuto dell'articolo
- Installazione di Lego
- Provider DNS API
- File di configurazione di Lego
- Emissione del certificato
- Deployment su Apache
- Rinnovo automatico
- Errori comuni
Concetti di base
- ACME – protocollo per l'emissione e il rinnovo automatizzati dei certificati SSL/TLS.
- Lego – un client ACME scritto in Go. Può eseguire la validazione DNS attraverso numerosi provider DNS (elenco dei provider DNS supportati).
- DNS-01 – validazione tramite il record DNS TXT
_acme-challenge. È necessaria per i certificati WildCard. - EAB kid + hmac – dettagli External Account Binding (EAB) dell'autorità di certificazione. Collegano Certbot a un account o a un prodotto.
- VEDOS WAPI – l'interfaccia API di VEDOS attraverso la quale Lego crea ed elimina i record DNS TXT.
- Systemd service - un file di configurazione che indica al sistema Linux come avviare un'applicazione e mantenerla in esecuzione anche dopo un riavvio del server.
In tutti gli esempi mostrati, sostituisci il dominio example.com con il tuo dominio.
Installazione di 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
Dopo un'installazione riuscita, consigliamo di rimuovere i file temporanei.
rm -f /tmp/lego /tmp/lego.tar.gz /tmp/LICENSE /tmp/CHANGELOG.md
| Comando / valore | Cosa fa / cosa sostituire |
|---|---|
apt update |
Aggiorna l'elenco dei pacchetti. |
apt install -y curl tar |
Installa gli strumenti per scaricare ed estrarre Lego. |
LEGO_URL=... |
Trova l'URL dell'ultimo pacchetto release per Linux amd64. |
curl -L -o lego.tar.gz |
Scarica l'archivio di Lego. |
tar -xzf lego.tar.gz |
Estrae l'archivio. |
install -m 0755 lego /usr/local/bin/lego |
Installa Lego come comando di sistema eseguibile. |
lego --version |
Verifica la versione di Lego installata. |
Provider DNS API
Questa guida utilizza la DNS API del registrar di domini Vedos, che offre un'API per gestire il DNS dei domini registrati. Per l'hosting web Vedos, devi attivare WAPI e inoltre inserire gli indirizzi IP consentiti e la password WAPI.
Il client LEGO supporta centinaia di altri provider DNS.
Puoi trovare il loro elenco sul sito web di LEGO - elenco dei provider DNS supportati.
Indirizzi IP del server VPS
curl -4 ifconfig.me
curl -6 ifconfig.me
| Comando / valore | Cosa fa / cosa sostituire |
|---|---|
curl -4 ifconfig.me |
Mostra l'indirizzo IPv4 pubblico del server, che deve essere consentito in VEDOS WAPI. |
curl -6 ifconfig.me |
Mostra l'indirizzo IPv6 pubblico del server, se il VPS ne utilizza uno. È consigliabile consentire anche questo indirizzo in VEDOS WAPI. |
Nel campo Indirizzi IP consentiti, inserisci tutti gli indirizzi IP in uscita del tuo server, tipicamente sia IPv4 sia IPv6. I valori sono separati da uno spazio. VEDOS consente le richieste API solo dagli indirizzi IP elencati.
Importante: Se consenti solo IPv4 e qualche richiesta API esce tramite IPv6, l'emissione del certificato può riuscire, ma la pulizia dei record TXT fallirà con l'errore Access not allowed from this IP address.
Valori consigliati per il provider DNS VEDOS
| Campo | Valore consigliato |
|---|---|
| Attiva WAPI | Attivo |
| Indirizzi IP consentiti | L'indirizzo IPv4 pubblico del VPS ed eventualmente IPv6 |
| Metodo di notifica | Coda POLL |
| Protocollo preferito | JSON |
| Password | La password WAPI generata, non la normale password di amministrazione |
Apache, webroot
La configurazione di base di Apache è una parte di supporto. La validazione DNS avviene tramite la DNS API, non tramite HTTP, ma il vhost Apache è necessario per servire il sito web dopo l'emissione del certificato.
›› Mostra/Nascondi sezionePrima dell'esecuzione, sostituisci il valore example.com nella riga DOMAIN="example.com" con il tuo dominio senza l'asterisco. La variabile $DOMAIN viene poi utilizzata nei comandi seguenti per i percorsi, il vhost Apache e la pagina di test.
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 / valore | Cosa fa / cosa sostituire |
|---|---|
cd /var/www |
Passa alla directory in cui vengono solitamente memorizzati i file web. |
apt update |
Aggiorna l'elenco dei pacchetti. |
apt install -y apache2 |
Installa Apache; -y conferma automaticamente l'installazione. |
systemctl enable --now apache2 |
Abilita Apache all'avvio del server e lo avvia contemporaneamente. |
a2enmod rewrite headers ssl |
Abilita i moduli per i redirect, gli header e l'HTTPS. |
DOMAIN="example.com" |
Imposta la variabile del dominio. Sostituisci example.com con il tuo dominio. |
mkdir/chown/chmod/echo |
Crea il webroot, imposta i permessi per Apache e salva una semplice pagina di test. |
Vhost HTTP sia per l'apex sia per i sottodomini:
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 / valore | Cosa fa / cosa sostituire |
|---|---|
cat > ... <<EOF |
Scrive un nuovo vhost HTTP Apache in un file in sites-available. |
ServerName $DOMAIN |
Il dominio principale del virtual host. |
ServerAlias *.$DOMAIN |
Consente la gestione di qualsiasi sottodominio di primo livello. |
DocumentRoot |
La directory da cui Apache serve i contenuti. |
a2ensite $DOMAIN.conf |
Abilita il vhost. |
apache2ctl configtest |
Verifica la sintassi della configurazione di Apache. |
curl -I http://$DOMAIN |
Verifica la risposta HTTP del dominio. |
File di configurazione di Lego
L'approccio consigliato per Lego v5 è memorizzare le impostazioni in un file di configurazione. Il systemd service non deve quindi contenere un lungo comando con domini, provider DNS e hook.
File di configurazione .env
Il file .env è un file di configurazione di testo in cui vengono memorizzate le variabili d'ambiente, ad esempio credenziali di accesso, chiavi API o impostazioni dell'applicazione. Per chiarezza, puoi nominare il file provider-domain.env. Il file vedos-example.com.env conterrà le credenziali di accesso VEDOS WAPI, quindi lo memorizziamo in /etc/lego e vi impostiamo permessi limitati.
DOMAIN="example.com"
mkdir -p /etc/lego/$DOMAIN
nano /etc/lego/vedos-$DOMAIN.env
| Comando / valore | Cosa fa / cosa sostituire |
|---|---|
DOMAIN="example.com" |
Imposta il dominio per i comandi seguenti. Sostituisci con il tuo dominio. |
mkdir -p /etc/lego/$DOMAIN |
Crea la directory per i dati e la configurazione di Lego del dominio indicato. |
nano /etc/lego/vedos-$DOMAIN.env |
Apre il file per le variabili dell'API VEDOS. |
Nella configurazione qui sotto, sostituisci WEDOS_LOGIN con il tuo login VEDOS e WEDOS_WAPI_PASSWORD con la password generata in VEDOS WAPI. Puoi lasciare i valori di timeout e interval così come sono.
WEDOS_USERNAME='WEDOS_LOGIN'
WEDOS_WAPI_PASSWORD='WEDOS_WAPI_PASSWORD'
WEDOS_PROPAGATION_TIMEOUT=3600
WEDOS_POLLING_INTERVAL=30
WEDOS_TTL=300
| Comando / valore | Cosa fa / cosa sostituire |
|---|---|
WEDOS_USERNAME |
Il login VEDOS dell'account che gestisce la zona DNS. |
WEDOS_WAPI_PASSWORD |
La password WAPI generata nell'amministrazione VEDOS. |
WEDOS_PROPAGATION_TIMEOUT |
Il tempo massimo di attesa per la propagazione DNS in secondi. |
WEDOS_POLLING_INTERVAL |
L'intervallo tra i controlli della propagazione DNS. |
WEDOS_TTL |
Il TTL dei record TXT creati per la challenge ACME. |
chmod 600 /etc/lego/vedos-$DOMAIN.env
File di configurazione lego.yml
Il file .yml è un file di configurazione di testo in formato YAML, utilizzato per una notazione chiara di impostazioni, parametri e dati strutturati. Prima di salvare la configurazione YAML, sostituisci example.com con il tuo dominio, *.example.com con il nome wildcard, vas@email.cz con la tua e-mail di contatto e i valori KID / HMAC con i dettagli del tuo ordine di certificato ACME. Nomi come certum-example o example-com-wildcard sono etichette interne; puoi lasciarli, ma con più domini è consigliabile rinominarli in base al dominio.
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 / valore | Cosa fa / cosa sostituire |
|---|---|
storage |
Directory per l'account Lego, i certificati e i metadati. |
accounts |
Definizione dell'account ACME, inclusi l'e-mail e i dettagli EAB. |
servers.certum.url |
L'endpoint ACME di Certum. |
challenges.vedos-dns |
Validazione DNS-01 tramite il provider VEDOS. |
envFile |
Il file con le credenziali di accesso dell'API VEDOS. |
certificates |
Elenco dei certificati che Lego deve gestire. |
domains |
Il dominio apex e il dominio wildcard nel certificato. |
renew.days |
Quanti giorni prima della scadenza Lego deve effettuare il rinnovo. |
hooks.deploy.command |
Comando dopo un'emissione o un rinnovo riuscito, qui il ricaricamento di Apache. |
chmod 600 /etc/lego/$DOMAIN/lego.yml
Il file lego.yml contiene l'HMAC EAB, quindi deve avere permessi limitati. Nella documentazione per i clienti, utilizza solo segnaposto.
Emissione del certificato
Prima dell'esecuzione, sostituisci example.com nel percorso con il dominio utilizzato durante la creazione della directory. La prima esecuzione crea l'account ACME, imposta i record DNS TXT tramite la DNS API, esegue la validazione DNS-01 e salva il certificato.
lego --config /etc/lego/$DOMAIN/lego.yml
Durante l'attesa, Lego può stampare:
dns01: waiting for record propagation timeout=1h0m0s interval=30s
| Comando / valore | Cosa fa / cosa sostituire |
|---|---|
lego --config |
Esegue Lego secondo il file di configurazione. Alla prima esecuzione emette il certificato, nelle esecuzioni successive gestisce il rinnovo. |
dns01: waiting for record propagation |
Lego ha creato il record TXT e attende finché non è visibile nel DNS. |
timeout=1h0m0s |
Attende al massimo un'ora. |
interval=30s |
Controlla il DNS ogni 30 secondi. |
Questo significa che Lego controlla il DNS ogni 30 secondi e attende al massimo 1 ora. Dopo il successo, verifica i file:
ls -la /etc/lego/$DOMAIN/certificates/
La directory certificates/ contiene il .crt emesso, la .key, i certificati intermedi dell'autorità di certificazione e i metadati.
Procedura CLI alternativa per Lego v5
›› Mostra/Nascondi sezioneSe non utilizzi un file di configurazione, in Lego v5 l'EAB viene inserito durante la registrazione dell'account. Prima dell'esecuzione, sostituisci example.com con il tuo dominio, vas@email.cz con la tua e-mail e KID / HMAC con i valori del tuo ordine.
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 / valore | Cosa fa / cosa sostituire |
|---|---|
lego accounts register |
Registra l'account ACME manualmente tramite la CLI senza lego.yml. |
--path |
Directory per l'account e i certificati. |
--server |
Endpoint ACME di Certum. |
--email |
E-mail di contatto. |
--accept-tos |
Accettazione dei termini di servizio. |
--eab |
Abilita l'External Account Binding. |
--eab.kid / --eab.hmac |
Dettagli EAB da CertManager. |
Elenco degli account. Nel percorso, utilizza di nuovo lo stesso dominio del comando precedente:
lego accounts list --path /etc/lego/example.com
Emissione del certificato ora senza parametri EAB. Sostituisci example.com con il tuo dominio e *.example.com con il 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 / valore | Cosa fa / cosa sostituire |
|---|---|
set -a |
Esporta automaticamente le variabili caricate dal file. |
. /etc/lego/vedos-example.com.env |
Carica le variabili dell'API VEDOS nella shell corrente. |
set +a |
Disattiva l'esportazione automatica delle variabili. |
lego run |
Emette o rinnova il certificato senza un file di configurazione. |
--dns vedos |
Utilizza la DNS API. |
--domains |
I domini che saranno presenti nel certificato. |
Deployment del certificato su Apache
Prima di creare il vhost HTTPS, sostituisci example.com con il tuo dominio nel nome del file, nei valori ServerName e ServerAlias, nei percorsi del webroot e nei percorsi del certificato. Questi percorsi devono corrispondere al dominio utilizzato nella configurazione di 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 / valore | Cosa fa / cosa sostituire |
|---|---|
cat > ...-le-ssl.conf |
Crea il vhost HTTPS di Apache. |
ServerName / ServerAlias |
Specifica il dominio apex e i sottodomini wildcard. |
SSLCertificateFile |
Percorso del certificato da Lego. |
SSLCertificateKeyFile |
Percorso della chiave privata da Lego. |
a2ensite |
Abilita il vhost HTTPS. |
systemctl reload apache2 |
Ricarica la nuova configurazione di Apache. |
curl -I https://... |
Verifica la risposta HTTPS. |
Rinnovo automatico
Lego può rinnovare il certificato, ma dopo l'installazione non crea autonomamente un systemd timer. L'esecuzione periodica viene impostata tramite un service e un timer personalizzati. Prima dell'inserimento, sostituisci example-com nel nome del service/timer con un tuo nome sicuro senza punti, ad esempio mojedomena-cz, e sostituisci example.com nel percorso di configurazione con il tuo dominio.
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 / valore | Cosa fa / cosa sostituire |
|---|---|
lego-example-com-renew.service |
Systemd service per un'esecuzione una tantum di Lego renew/run. |
Type=oneshot |
Il servizio si avvia, svolge il proprio compito e termina. |
ExecStart |
Esegue Lego secondo lego.yml. |
lego-example-com-renew.timer |
Systemd timer che esegue il servizio periodicamente. |
OnCalendar |
Orario del controllo quotidiano. |
RandomizedDelaySec |
Ritardo casuale affinché le richieste non partano tutte esattamente nello stesso momento. |
Persistent=true |
Esegue un'esecuzione mancata dopo l'avvio del server. |
systemctl enable --now |
Abilita il timer e lo attiva immediatamente. |
Test sicuro del servizio:
systemctl start lego-example-com-renew.service
journalctl -u lego-example-com-renew.service -n 100 --no-pager
| Comando / valore | Cosa fa / cosa sostituire |
|---|---|
systemctl start ...service |
Esegue manualmente il servizio di rinnovo per un test. |
journalctl -u ... |
Mostra i log più recenti del servizio. |
Se il certificato non è prossimo alla scadenza, Lego può segnalare che il rinnovo non è necessario. Questo è un comportamento corretto.
Errori comuni
Parametro sconosciuto in Lego
In Lego v5 i parametri EAB sono --eab.kid e --eab.hmac. I parametri appartengono sempre a un sottocomando specifico.
lego accounts register --help
lego accounts list --help
lego run --help
La pulizia dei record TXT fallisce a causa di un IP non consentito
Cleaning up failed ... Access not allowed from this IP address (2a02:...)
Aggiungi anche l'indirizzo IPv6 del server agli indirizzi IP consentiti in VEDOS WAPI. Il certificato può essere emesso correttamente, ma i record TXT rimarranno nel DNS dopo la validazione.
Checklist di verifica
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 / valore | Cosa fa / cosa sostituire |
|---|---|
dig TXT |
Verifica i record TXT nel DNS. |
lego --config |
Esegue la configurazione di Lego. |
systemctl status |
Mostra lo stato del timer. |
apache2ctl configtest |
Verifica la configurazione di Apache. |
curl -I |
Verifica la risposta HTTPS. |
Dove andare ora?
Torna alla Guida
Hai trovato un errore o non capisci qualcosa? Scrivici!
