SSLmentor

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

Lego

Lego

Client ACME Lego

Il client ACME Lego è un progetto indipendente, gratuito e open source scritto nel linguaggio Go. È ideale per l'integrazione personalizzata e lo scripting e gode di un ampio supporto da parte di registrar di domini e provider DNS. Lego è un client ACME flessibile che può essere facilmente integrato in sistemi e script personalizzati. Oltre alla validazione HTTP-01, offre la validazione DNS attraverso numerosi provider DNS (elenco dei provider DNS supportati) per ottenere certificati SSL WildCard.
La guida utilizza una sintassi verificata sulla versione Lego 5.*.* ed è destinata a Debian/Ubuntu con Apache 2 e il client ACME Lego.

Concetti di base

  • ACME – protocollo per l'emissione e il rinnovo automatizzati dei certificati SSL/TLS.
  • HTTP-01 – metodo di validazione ACME che verifica la proprietà del dominio utilizzando un file temporaneo accessibile tramite HTTP.
  • DNS-01 – metodo di validazione tramite il record DNS TXT _acme-challenge.
  • EAB kid + hmac – dettagli External Account Binding (EAB) dell'autorità di certificazione. Collegano Certbot a un account o a un prodotto.
  • 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.

Se negli esempi compare il dominio example.com, sostituiscilo sempre 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.

Apache, webroot

Questa procedura crea una configurazione VirtualHost di base per il dominio sulla porta 80. Imposta DocumentRoot, i permessi per la directory web, crea i log di Apache, abilita la configurazione tramite a2ensite, ne verifica la correttezza (apache2ctl configtest) e ricarica le modifiche. Infine, verifica la disponibilità del sito web tramite una richiesta HTTP curl.

›› Mostra/Nascondi sezione

Prima dell'esecuzione, sostituisci il valore example.com nella riga DOMAIN="example.com" con il tuo dominio. 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

# or just updates
apt update
apt install --only-upgrade apache2
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 il sottodominio:


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"
curl -I "http://www.$DOMAIN"

Risultato: Dopo aver aperto http://example.com, dovrebbe comparire la pagina di test.

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 www.$DOMAIN Crea la gestione del 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 e hook.

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, vas@email.cz con la tua e-mail di contatto e i valori KID / HMAC con i dettagli del tuo ordine di certificato ACME.

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

accounts:
  certum-account:
    server: certum
    email: your@email.com   # your email address for CA Certum
    acceptsTermsOfService: true
    eab:
      kid: KID
      hmacKey: HMAC

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

challenges:
  http-chal:
    http:
      # Path to your website's document root.
      # Lego will temporarily write a file to this directory .well-known/acme-challenge/
      webroot: /var/www/example.com/public

certificates:
  example-com:
    account: certum-account
    challenge: http-chal
    domains:
      - example.com
      - www.example.com
    renew:
      days: 30

hooks:
  deploy:
    command: systemctl reload apache2

Suggerimento! Puoi generare un contenuto YML quasi completo direttamente sul server e poi limitarti a inserire l'e-mail, il kid e l'hmacKey corretti. Esegui semplicemente il comando qui sotto e copia il contenuto dalla pagina index.html nel file lego.yml.
›› Mostra/Nascondi lo YML preparato.

cat > "/var/www/$DOMAIN/public/index.html" <<EOF
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>${DOMAIN}</title>
<style>
body { font-family: sans-serif; max-width: 900px; margin: 40px auto; }
pre { background:#f4f4f4; padding:1em; overflow:auto; }
</style>
</head>
<body>

<h1>OK – ${DOMAIN}</h1>
<p>Apache is working correctly.</p>
<h2>lego.yml</h2>
<pre><code>storage: /etc/lego/${DOMAIN}

accounts:
  certum-account:
    server: certum
    email: YOUR_EMAIL
    acceptsTermsOfService: true
    eab:
      kid: YOUR_KID
      hmacKey: YOUR_HMAC_KEY

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

challenges:
  http-chal:
    http:
      webroot: /var/www/${DOMAIN}/public

certificates:
  ${DOMAIN//./-}:
    account: certum-account
    challenge: http-chal
    domains:
      - ${DOMAIN}
      - www.${DOMAIN}
    renew:
      days: 30

hooks:
  deploy:
    command: systemctl reload apache2
</code></pre>

</body>
</html>
EOF

Il file lego.yml contiene l'HMAC EAB, quindi deve avere permessi limitati. Nella documentazione, utilizza solo segnaposto.

chmod 600 /etc/lego/$DOMAIN/lego.yml

Verifica dei permessi e del proprietario del file:

stat -c "%a %U:%G %n" /etc/lego/$DOMAIN/lego.yml
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.http-chal Validazione tramite http.
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.

Emissione del certificato SSL/TLS

Prima dell'esecuzione, controlla echo ${DOMAIN} oppure imposta la variabile DOMAIN sul nome del tuo dominio DOMAIN="example.com". Lo strumento Lego esegue la validazione HTTP-01 utilizzando un file memorizzato temporaneamente nel webroot, verifica la proprietà del dominio e crea quindi un certificato SSL/TLS. Il certificato, la chiave privata e il certificato dell'emittente (intermediate) verranno memorizzati nella directory /etc/lego/${DOMAIN}/certificates/.

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

Durante la generazione, il client ACME Lego stamperà le informazioni sulla richiesta:

root@vmiXXXXXXXX:~# echo ${DOMAIN}
example.com

root@:~# lego --config /etc/lego/$DOMAIN/lego.yml

INFO  Archive account scope=accountID filepath=/etc/lego/example.com/accounts/acme.certum.pl/certum-acme/
      archives=/etc/lego/example.com/archives/accounts/acme.certum.pl_certum-acme_1785270773.zip
INFO  Private key saved. filepath=/etc/lego/example.com/accounts/acme.certum.pl/certum-account/certum-account.key
INFO  Registering the account (EAB). email=your@email.com
WARN  !!!! HEADS UP !!!!

Your account credentials have been saved in your
configuration directory at "/etc/lego/example.com/accounts".

You should make a secure backup of this folder now. This
configuration directory will also contain private keys
generated by lego and certificates obtained from the ACME
server. Making regular backups of this folder is ideal.

INFO  Obtaining bundled SAN certificate. domains="example.com, www.example.com"
INFO  Use solver. domain=www.example.com type=http-01
INFO  Use solver. domain=example.com type=http-01
INFO  http01: Trying to solve HTTP-01. domain=www.example.com
INFO  The server validated our request. domain=www.example.com
INFO  http01: Trying to solve HTTP-01. domain=example.com
INFO  The server validated our request. domain=example.com
INFO  Validations succeeded; requesting certificates. domains="example.com, www.example.com"
INFO  Waiting for certificates. timeout=30s interval=500ms domains="example.com, www.example.com"
INFO  Server responded with a certificate. domains="example.com, www.example.com"
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.crt
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.issuer.crt
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.key
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.pem
INFO  Writing file. filepath=/etc/lego/example.com/certificates/acmeapi-online.json

Verifica i file del certificato SSL generato

Mostra il contenuto della directory certificates creata dal servizio Lego, incluso il certificato, la chiave privata e il certificato dell'emittente per il dominio selezionato.

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.

Deployment del certificato su Apache

Questo esempio utilizza la variabile ${DOMAIN}, che dovresti già avere impostato dall'inizio della guida. Prima di eseguire i comandi, puoi assicurarti che la variabile sia impostata correttamente, ad esempio: echo ${DOMAIN}
La variabile ${DOMAIN} viene utilizzata nel nome del file di configurazione, nei valori ServerName e ServerAlias e nel percorso del webroot.
Attenzione! - i percorsi del certificato SSL e della chiave privata utilizzano il dominio nella forma example-com. I percorsi devono corrispondere al dominio utilizzato nella configurazione di Lego.


cat > /etc/apache2/sites-available/${DOMAIN}-le-ssl.conf <<EOF
<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerName ${DOMAIN}
    ServerAlias www.${DOMAIN}

    DocumentRoot /var/www/${DOMAIN}/public
    <Directory /var/www/${DOMAIN}/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    SSLEngine on
    SSLCertificateFile /etc/lego/${DOMAIN}/certificates/${DOMAIN//./-}.crt
    SSLCertificateKeyFile /etc/lego/${DOMAIN}/certificates/${DOMAIN//./-}.key

    ErrorLog ${APACHE_LOG_DIR}/${DOMAIN}_ssl_error.log
    CustomLog ${APACHE_LOG_DIR}/${DOMAIN}_ssl_access.log combined
</VirtualHost>
</IfModule>
EOF
a2ensite ${DOMAIN}-le-ssl.conf
apache2ctl configtest
systemctl reload apache2

curl -I https://${DOMAIN}
curl -I https://www.${DOMAIN}

Risultato: HTTPS funzionante.

Comando / valore Cosa fa / cosa sostituire
cat > ...-le-ssl.conf Crea il vhost HTTPS di Apache.
ServerName / ServerAlias Specifica il dominio apex e il sottodominio.
SSLCertificateFile Percorso del certificato.
SSLCertificateKeyFile Percorso della chiave privata.
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 automaticamente, ma dopo l'installazione non crea autonomamente le unità systemd per l'esecuzione periodica. Per il rinnovo automatico è quindi necessario creare due unità:

  • lego-example-com-renew.service – esegue il controllo e, se necessario, il rinnovo del certificato.
  • lego-example-com-renew.timer – garantisce che il servizio venga eseguito quotidianamente a un orario stabilito.

Prima dell'inserimento, sostituisci example-com nel nome del service/timer con il tuo nome se necessario, e sostituisci example.com nel percorso di configurazione con il tuo dominio.


cat > /etc/systemd/system/lego-${DOMAIN//./-}-renew.service <<EOF
[Unit]
Description=Renew ACME Certum SSL for example.com using Lego HTTP-01
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/lego --config /etc/lego/${DOMAIN}/lego.yml
EOF

cat > /etc/systemd/system/lego-${DOMAIN//./-}-renew.timer <<EOF
[Unit]
Description=Daily Lego renewal check for ${DOMAIN}

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

[Install]
WantedBy=timers.target
EOF

Dopo aver creato le unità, verificane il contenuto:

cat /etc/systemd/system/lego-example-com-renew.service
echo "----------------"
cat /etc/systemd/system/lego-example-com-renew.timer

Ricarica le nuove unità, abilita il timer e verifica che sia in esecuzione:

systemctl daemon-reload
systemctl enable --now lego-${DOMAIN//./-}-renew.timer
systemctl list-timers | grep lego

Risultato: Il timer è attivo e systemd ha pianificato la sua prossima esecuzione.

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-${DOMAIN//./-}-renew.service
systemctl status lego-${DOMAIN//./-}-renew.service --no-pager
journalctl -u lego-${DOMAIN//./-}-renew.service -n 100 --no-pager

Risultato: Se il certificato non è prossimo alla scadenza, Lego può segnalare che il rinnovo non è necessario. Questo è un comportamento corretto.

Comando / valore Cosa fa / cosa sostituire
systemctl start ...service Esegue manualmente il servizio di rinnovo per un test.
systemctl status ... Mostra se il servizio è terminato correttamente
journalctl -u ... Mostra i log più recenti del servizio.

Elenco delle unità Lego disponibili:

ls -l /etc/systemd/system/lego*

systemctl list-timers | grep lego

Risultato: Entrambe le varianti mostrano tutti i servizi e i timer relativi al client ACME Lego.

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

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