Un certificato SSL scaduto blocca l'accesso al vostro sito con un avviso di sicurezza spaventoso per gli utenti. Google Chrome mostra "La connessione non è privata" e i visitatori se ne vanno. Il danno è immediato: perdita di traffico, calo del ranking SEO e perdita di fiducia dei clienti.
Perché i certificati scadono
I certificati SSL/TLS hanno una durata limitata per ragioni di sicurezza:
| Tipo | Durata tipica | Emittente | |------|---------------|-----------| | Let's Encrypt | 90 giorni | Automatizzabile con certbot | | DV (Domain Validation) | 1 anno | DigiCert, Sectigo, GlobalSign | | OV (Organization Validation) | 1-2 anni | DigiCert, Sectigo | | EV (Extended Validation) | 1 anno | DigiCert, Sectigo |
La tendenza è verso durate sempre più brevi — Apple e Google spingono per certificati di 90 giorni massimo.
Verificare il certificato attuale
Da browser
Cliccate sul lucchetto nella barra degli indirizzi → "Certificato" → verificate la data di scadenza.
Da terminale
# Verifica scadenza
echo | openssl s_client -servername vostro-sito.it -connect vostro-sito.it:443 2>/dev/null | openssl x509 -noout -dates
# Output:
# notBefore=Jan 15 00:00:00 2026 GMT
# notAfter=Apr 15 23:59:59 2026 GMT
Verifica completa
# Dettagli certificato
echo | openssl s_client -servername vostro-sito.it -connect vostro-sito.it:443 2>/dev/null | openssl x509 -noout -text | grep -E "Subject:|Issuer:|Not Before:|Not After:"
Configurare il rinnovo automatico
Let's Encrypt con Certbot
La soluzione più diffusa e gratuita:
# Installazione
sudo apt install certbot python3-certbot-nginx
# Primo certificato
sudo certbot --nginx -d vostro-sito.it -d www.vostro-sito.it
# Verifica rinnovo automatico
sudo certbot renew --dry-run
# Il cron job è configurato automaticamente in:
# /etc/cron.d/certbot
# oppure
# systemctl list-timers | grep certbot
Rinnovo con Docker
Se usate Docker con un reverse proxy:
# docker-compose.yml con Traefik
services:
traefik:
image: traefik:v3
command:
- "--certificatesresolvers.letsencrypt.acme.email=admin@vostro-sito.it"
- "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json"
- "--certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web"
volumes:
- "./letsencrypt:/letsencrypt"
Cloudflare
Se usate Cloudflare come CDN, i certificati sono gestiti automaticamente. Verificate:
- SSL/TLS → Modalità "Full (strict)"
- Edge Certificates → Rinnovo automatico attivo
- Origin Server → Certificate valido
Monitoraggio della scadenza
Script di monitoraggio
#!/bin/bash
# check-ssl.sh — Verifica scadenza certificato
DOMAIN="vostro-sito.it"
DAYS_WARNING=30
EXPIRY=$(echo | openssl s_client -servername $DOMAIN -connect $DOMAIN:443 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( (EXPIRY_EPOCH - NOW_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt $DAYS_WARNING ]; then
echo "ALLARME: Il certificato di $DOMAIN scade tra $DAYS_LEFT giorni!"
# Inviare notifica (email, Telegram, Slack)
fi
Servizi di monitoraggio
| Servizio | Tipo | Prezzo | |----------|------|--------| | UptimeRobot | Monitoraggio uptime + SSL | Gratuito (base) | | Better Uptime | Monitoraggio + SSL + pagina di stato | Gratuito (base) | | SSL Labs | Test approfondito della configurazione | Gratuito | | WarDek Scanner | Scansione completa sicurezza + SSL | Gratuito (piano base) |
Troubleshooting: certificato scaduto
Sintomi
- Browser mostra "NET::ERR_CERT_DATE_INVALID"
- HTTPS non funziona, HTTP redirect in loop
- Google rimuove le pagine dall'indice
- Webhook e API di terze parti falliscono
Azioni immediate
- Verificare lo stato del certificato con OpenSSL
- Rinnovare manualmente:
sudo certbot renew --force-renewal - Riavviare il web server:
sudo systemctl reload nginx - Verificare che il sito funzioni
- Controllare i log di certbot:
sudo journalctl -u certbot
Cause comuni di mancato rinnovo
| Causa | Soluzione |
|-------|----------|
| Cron job disabilitato | Verificare systemctl status certbot.timer |
| Porta 80 bloccata | Let's Encrypt necessita la porta 80 per la validazione HTTP |
| DNS non aggiornato | Il dominio deve puntare al server corretto |
| Firewall troppo restrittivo | Permettere il traffico da Let's Encrypt |
| Spazio disco pieno | Liberare spazio e rilanciare il rinnovo |
Best practice per la configurazione TLS
Versioni TLS supportate
# Nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
TLS 1.0 e 1.1 sono deprecati e non devono essere utilizzati. TLS 1.2 è il minimo, TLS 1.3 è raccomandato.
Suite crittografiche
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
HSTS
Dopo aver verificato che HTTPS funziona correttamente:
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
Impatto SEO di un certificato scaduto
Google tratta HTTPS come fattore di ranking. Un certificato scaduto:
- Blocca l'indicizzazione delle nuove pagine
- Degrada il ranking delle pagine esistenti
- Aumenta il bounce rate (utenti spaventati dall'avviso)
- Interrompe il tracking analytics (GA non funziona senza HTTPS)
Il recupero dopo un certificato scaduto può richiedere settimane di re-indicizzazione.
Conclusione
Un certificato SSL scaduto è un incidente di sicurezza evitabile al 100%. Automatizzate il rinnovo con Let's Encrypt, configurate il monitoraggio e non dovrete mai più affrontare l'emergenza di un certificato scaduto in produzione.
Scansiona il tuo sito web gratis con WarDek — OWASP, NIS2, GDPR, AI Act in un'unica scansione.