Client ACME Certbot
Una guida dettagliata per il deployment completo di un certificato SSL DV ACME su VPS Debian (Apache) con rinnovo automatico tramite il timer predefinito di Certbot. La guida descrive il deployment di un certificato DV a dominio singolo o multi-dominio, ad esempio example.com e www.example.com. Per i deployment standard consigliamo di utilizzare la directory standard di Certbot /etc/letsencrypt. In questo modo i rinnovi sono gestiti dal timer di sistema predefinito certbot.timer.
Questa guida non tratta i certificati SSL wildcard WildCard, che richiedono la validazione DNS e una DNS API per il rinnovo automatico.
Contenuto dell'articolo
- Concetti di base
- Apache, webroot
- Certbot, emissione del certificato
- Più certificati su un unico server
- Più account EAB
Concetti di base
- ACME – Protocollo per l'emissione e il rinnovo automatizzati dei certificati SSL/TLS.
- Certbot – Un client ACME che comunica con l'autorità di certificazione e può distribuire un certificato ad Apache.
- kid + hmac – Credenziali External Account Binding (EAB) dell'autorità di certificazione. Collegano Certbot a un account o a un prodotto.
kid e hmac non verificano la proprietà del dominio, ma collegano il client ACME a un account CA. Il dominio viene verificato separatamente tramite la challenge ACME. hmac è un valore sensibile — non condividerlo pubblicamente e non conservarlo in guide condivise. - http-01 – Validazione del dominio tramite un file temporaneo accessibile all'indirizzo HTTP del dominio.
- dns-01 – Validazione tramite record DNS TXT. Necessaria per i certificati wildcard.
Negli esempi, sostituisci example.com con il tuo dominio.
Apache, webroot
Configurazione di base di Apache e del dominio sul server.
›› Mostra/Nascondi sezioneCreazione di un webroot separato per il dominio e di una semplice pagina di test. Apache su Debian utilizza per impostazione predefinita l'utente www-data.
apt update
apt install -y apache2
systemctl enable --now apache2
a2enmod rewrite headers ssl
systemctl reload apache2
| Comando | Cosa fa |
|---|---|
apt update |
Aggiorna l'elenco dei pacchetti dai repository Debian. |
apt install -y apache2 |
Installa il server web Apache. Il parametro -y conferma automaticamente l'installazione. |
systemctl enable --now apache2 |
Abilita Apache all'avvio del server e lo avvia immediatamente. |
a2enmod rewrite headers ssl |
Abilita i moduli Apache comuni per i redirect, gli header e l'HTTPS. |
systemctl reload apache2 |
Ricarica la configurazione di Apache senza un riavvio completo del servizio. |
Preparazione del webroot
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
Creazione di un virtual host Apache
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
Attivazione del sito Apache e verifica HTTP
Prima dell'emissione del certificato, il dominio deve rispondere tramite HTTP. Questo è necessario per la validazione ACME http-01.
a2ensite $DOMAIN.conf
apache2ctl configtest
systemctl reload apache2
curl -I http://$DOMAIN
curl http://$DOMAIN
Installazione di Certbot + emissione di un certificato
Installazione di Certbot dai repository Debian. Il pacchetto python3-certbot-apache consente a Certbot di modificare la configurazione di Apache, eseguire la validazione e distribuire il certificato emesso.
apt install -y certbot python3-certbot-apache
certbot --version
Certbot supporta un'ampia gamma di sistemi e server web. Consigliamo di consultare le Certbot Instructions per la procedura specifica relativa al server web scelto.
Registrazione dell'account ACME
Per emettere un certificato è necessario disporre di un account ACME presso l'autorità di certificazione. In questa guida utilizzeremo i certificati ACME della CA Certum.
Le credenziali EAB (kid + hmac) le otterrai nei dettagli dell'ordine.
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
| Parametro | Significato |
|---|---|
--server |
Specifica il particolare endpoint ACME. Senza questo parametro, Certbot utilizzerebbe il server ACME predefinito. CA DigiCert: https://one.digicert.com/mpki/api/v1/acme/v2/directory CA Sectigo: https://acme.sectigo.com/v2/DV |
--email |
E-mail di contatto per l'account ACME. |
--agree-tos |
Accettazione dei termini di servizio. |
--eab-kid |
Identificatore KID. |
--eab-hmac-key |
Chiave segreta HMAC EAB. |
Emissione di un certificato ACME
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN \
-d www.$DOMAIN
Il parametro --cert-name è particolarmente importante quando si gestiscono più certificati su un unico server. Ogni singolo certificato dovrebbe avere il proprio nome univoco.
Verifica del certificato e rinnovo automatico
certbot certificates
systemctl list-timers | grep certbot
certbot renew --dry-run
curl -I https://$DOMAIN
| Comando | Scopo |
|---|---|
certbot certificates |
Mostra i certificati gestiti da Certbot. |
systemctl list-timers | grep certbot |
Verifica che il timer di rinnovo automatico predefinito sia in esecuzione. |
certbot renew --dry-run |
Simula il rinnovo del certificato senza sostituire il certificato di produzione. Output corretto: "all simulated renewals succeeded". |
curl -I https://$DOMAIN |
Verifica la risposta HTTPS del dominio. |
Più certificati su un unico server
Certbot può gestire più certificati nella directory standard /etc/letsencrypt. Questo modello è il più semplice per i deployment dei clienti perché utilizza il certbot.timer predefinito.
- Crea un vhost Apache separato
Ogni dominio dovrebbe avere il proprio file in /etc/apache2/sites-available/ e il proprio webroot. - Emetti un certificato con un --cert-name univoco
Non utilizzare lo stesso nome di certificato per un altro singolo certificato. - Verifica il rinnovo di tutti i certificati
Il comando certbot renew --dry-run deve andare a buon fine per tutte le voci in /etc/letsencrypt/renewal/.
Comando di esempio per un dominio aggiuntivo example.net:
DOMAIN="example.net"
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
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
certbot --apache \
--server https://acme.certum.pl/directory \
--cert-name $DOMAIN \
-d $DOMAIN
-d www.$DOMAIN
certbot renew --dry-run
Soluzione alternativa per più account EAB
Presso l'autorità di certificazione, ogni prodotto può avere i propri valori EAB. Se sul server è già registrato un account ACME della CA, un'altra registrazione per lo stesso server ACME può generare un errore:
There is an existing account; registration of a duplicate account with this command is currently unsupported.
In tale situazione, rimani nella directory standard /etc/letsencrypt, ma registra il nuovo account utilizzando la seguente soluzione alternativa. Dopo l'emissione, usa lo specifico --account ACCOUNT_ID.
Spostamento temporaneo degli account esistenti
ACME_ACCOUNT_DIR="/etc/letsencrypt/accounts/acme.certum.pl/directory"
BACKUP_DIR="/root/certbot-certum-accounts-backup-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"
find "$ACME_ACCOUNT_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$BACKUP_DIR"/ \;
Registrazione di un nuovo account EAB
certbot register \
--server https://acme.certum.pl/directory \
--email certum@example.com \
--agree-tos \
--eab-kid 'KID' \
--eab-hmac-key 'HMAC'
Individuazione dell'ID del nuovo account
ls -1 "$ACME_ACCOUNT_DIR"
L'output di questo comando è il nuovo ACCOUNT_ID. Utilizza questo valore durante l'emissione del certificato.
Ripristino degli account originali
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -exec mv {} "$ACME_ACCOUNT_DIR"/ \;
Emissione di un certificato tramite un account specifico
certbot --apache \
--server https://acme.certum.pl/directory \
--account ACCOUNT_ID \
--cert-name example.net \
-d example.net \
-d www.example.net
| Perché serve la soluzione alternativa | Cosa risolve |
|---|---|
| Certbot rifiuta di registrare un account duplicato per lo stesso server ACME. | Lo spostamento temporaneo degli account consente la registrazione di un nuovo account EAB. |
La directory standard /etc/letsencrypt dovrebbe rimanere sul server. |
Il certbot.timer predefinito rinnova quindi tutti i certificati senza un cron personalizzato. |
| Ogni prodotto della CA può avere il proprio binding EAB. | Il parametro --account forza l'account CA corretto durante l'emissione. |
Checklist di verifica
apache2ctl configtestrestituisceSyntax OK.curl -I http://example.comrisponde tramite HTTP.curl -I https://example.comrisponde tramite HTTPS.certbot certificatesmostra il certificato previsto.certbot renew --dry-runva a buon fine senza errori.systemctl list-timers | grep certbotmostra uncertbot.timerattivo.
Dove andare ora?
Torna alla Guida
Hai trovato un errore o non capisci qualcosa? Scrivici!
