SSLmentor

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

Certbot

Certbot

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.

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 sezione

Creazione 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 configtest restituisce Syntax OK.
  • curl -I http://example.com risponde tramite HTTP.
  • curl -I https://example.com risponde tramite HTTPS.
  • certbot certificates mostra il certificato previsto.
  • certbot renew --dry-run va a buon fine senza errori.
  • systemctl list-timers | grep certbot mostra un certbot.timer attivo.

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

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