SSLmentor

Certificati TLS/SSL di qualità per siti web e progetti su internet.

Lego & ACME WildCard

Lego & ACME WildCard

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.

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 sezione

Prima 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 sezione

Se 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.

Torna alla Guida
Hai trovato un errore o non capisci qualcosa? Scrivici!

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