I problemi relativi ai certificati SSL sono uno dei problemi tecnici più fastidiosi che un sito possa avere. Un certificato scaduto blocca ogni visitatore con un avviso del browser. Un certificato configurato in modo errato provoca errori silenziosi. Un certificato emesso per il dominio sbagliato interrompe i sottodomini. E a differenza della maggior parte dei problemi, i problemi relativi ai certificati si verificano in base a un programma: scadono, quindi sono del tutto prevenibili se sai dove cercare.

Ecco come controllare qualsiasi certificato SSL, cosa significa ogni campo e cosa fare quando qualcosa non va.

Il controllo rapido: il tuo browser

Per qualsiasi sito che stai visitando, il controllo SSL più veloce è proprio nel tuo browser.

Cromo/Bordo: Fai clic sull'icona del lucchetto (o sul testo "La connessione è sicura") accanto all'URL → Il certificato è valido → Dettagli del certificato

Firefox: Fare clic sull'icona del lucchetto → Connessione protetta → Ulteriori informazioni → Visualizza certificato

Questo ti mostra:

  • A chi è stato rilasciato il certificato (il dominio)
  • Chi lo ha rilasciato (l'Autorità di Certificazione)
  • Valido dal / Valido fino alle date
  • Numero di serie e impronta digitale del certificato

Per un rapido controllo di integrità (questo certificato è valido e appartiene al dominio corretto) l'interfaccia utente del browser è tutto ciò di cui hai bisogno.

Il controllo approfondito: strumento online

Per un'analisi completa di un certificato comprese le suite di crittografia, la validità della catena, la configurazione HSTS e le vulnerabilità note, utilizzare Strumento di controllo SSL. Inserisci qualsiasi dominio ed eseguirà un'analisi completa senza dover installare nulla.

Ciò è particolarmente utile per:

  • Certificati su server a cui non puoi accedere direttamente
  • Verifica di un nuovo certificato dopo l'installazione
  • Controllo dei certificati prima che stiano per scadere
  • Controllo della robustezza della suite di crittografia (TLS 1.0/1.1 deve essere disabilitato)

La riga di comando: openssl

Per sviluppatori e amministratori di sistema, openssl ti dà l'ispezione diretta del certificato dal terminale.

Controlla il certificato di un server remoto:

Comando
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | openssl x509 -noout -text

Restituisce i dettagli completi del certificato. Campi chiave da esaminare:

Data di scadenza:

Comando
openssl s_client -connect example.com:443 -servername example.name </dev/null 2>/dev/null | openssl x509 -noout -dates

Uscita:

Comando
notBefore=Jan  1 00:00:00 2025 GMT
notAfter=Jan  1 00:00:00 2026 GMT

Controlla un file di certificato locale:

Comando
openssl x509 -in certificate.crt -noout -text
openssl x509 -in certificate.crt -noout -dates
openssl x509 -in certificate.crt -noout -subject -issuer

Verificare una catena di certificati:

Comando
openssl verify -CAfile chain.pem certificate.crt

Controlla i giorni fino alla scadenza (scriptable):

Comando
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2 | xargs -I{} date -d {} +%s | xargs -I{} expr \( {} - $(date +%s) \) / 86400

Restituisce il numero di giorni rimanenti. Utile nel monitoraggio degli script.

Cosa significa ogni campo del certificato

Soggetto/Nome comune (CN): Il dominio per il quale è stato emesso il certificato. Deve corrispondere al dominio che stai visitando, altrimenti il ​​browser mostrerà un avviso. Per i certificati con caratteri jolly, questo è *.example.com.

Nomi alternativi soggetto (SAN): L'elenco di tutti i domini coperti dal certificato. I certificati moderni utilizzano SAN anziché solo CN. Un certificato potrebbe coprire example.com, www.example.come api.example.com — tutti elencati qui. Questo è ciò che effettivamente controlla il browser.

Emittente: L'Autorità di Certificazione (CA) che ha firmato il certificato. Quelli comuni: Let's Encrypt, DigiCert, Sectigo, Google Trust Services, Amazon. Il certificato dell'emittente è firmato da una CA radice considerata attendibile dai browser.

Periodo di validità: Date non prima e non dopo. I certificati scadono: i certificati Let's Encrypt scadono ogni 90 giorni (con rinnovo automatico). I certificati commerciali durano tipicamente 1 anno.

Algoritmo chiave e dimensione: RSA 2048 bit è il minimo; 4096 bit o EC P-256 sono più potenti. I certificati EC (curva ellittica) offrono una sicurezza equivalente con chiavi di dimensioni inferiori, il che migliora leggermente le prestazioni.

Versione TLS: Il tuo server dovrebbe supportare TLS 1.2 e TLS 1.3. TLS 1.0 e 1.1 sono deprecati e dovrebbero essere disabilitati: i browser moderni rifiutano le connessioni su questi.

Trasparenza del certificato: I certificati moderni vengono registrati nei registri pubblici di Certificate Transparency. Questo è obbligatorio per i certificati attendibili da Chrome. Consente a chiunque di verificare quali certificati sono stati emessi per un dominio, utile per rilevare certificati non autorizzati.

Problemi SSL comuni e come risolverli

Certificato scaduto Il problema più comune. Il tuo browser mostra "La tua connessione non è privata" con errore NET::ERR_CERT_DATE_INVALID.

Correzione: rinnova il certificato. Se stai utilizzando Let's Encrypt con Certbot, esegui certbot renew. Se utilizzi un certificato a pagamento, acquista un rinnovo tramite la tua CA e installalo. Imposta il monitoraggio per avvisarti 30 giorni prima della scadenza in modo che ciò non accada mai in produzione.

Mancata corrispondenza del dominio del certificato Il certificato è stato rilasciato per example.com ma sei in visita www.example.com (o viceversa) e il certificato non include l'altro come SAN.

Correzione: ottieni un certificato che copra entrambi (la maggior parte dei certificati dovrebbe farlo) o reindirizza l'uno all'altro in modo coerente.

Catena di certificati incompleta Il tuo server presenta il tuo certificato ma non i certificati intermedi che lo connettono a una CA radice attendibile. I browser che hanno memorizzato nella cache l'intermedio possono connettersi; altri vedono un errore.

Correzione: configura il tuo server web per inviare l'intera catena. Con Nginx, usa ssl_certificate che punta a un file che include sia il certificato che il pacchetto intermedio. Con Apache, usa SSLCertificateChainFile.

Controlla specificamente questo problema:

Comando
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null | grep -A 1 "Certificate chain"

Dovresti vedere almeno 2 certificati nella catena (il tuo certificato + intermedio).

Certificato autofirmato I browser non si fidano dei certificati che non sono firmati da una CA riconosciuta. I certificati autofirmati vanno bene per lo sviluppo interno, ma attiveranno avvisi per qualsiasi sito pubblico.

Correzione: ottieni un certificato da una CA attendibile. Let's Encrypt è gratuito e automatizzato per i domini pubblici.

Suite di crittografia debole Il server negozia una connessione TLS utilizzando algoritmi obsoleti o deboli (RC4, DES, cifrari di livello esportazione, TLS 1.0/1.1).

Verificare con:

Comando
nmap --script ssl-enum-ciphers -p 443 example.com

Correzione: aggiorna la configurazione SSL del tuo server web solo alle moderne suite di crittografia. Quello di Mozilla Generatore di configurazione SSL genera configurazioni pronte da incollare per Nginx, Apache e altri.

Monitoraggio dei certificati

Il controllo manuale dei certificati prima della scadenza non è scalabile. Opzioni per il monitoraggio automatizzato:

Rinnovo automatico Certbot: Se utilizzi Let's Encrypt, Certbot imposta un processo cron o un timer systemd che rinnova automaticamente i certificati quando restano meno di 30 giorni. Verifica che funzioni: certbot renew --dry-run

Servizi di monitoraggio del tempo di attività: La maggior parte dei monitoraggi di uptime (UptimeRobot, Freshping, Better Uptime) includono avvisi di scadenza del certificato. Imposta una soglia di avviso di 30 giorni.

Script personalizzato in cron: Un semplice script bash che utilizza il file openssl sopra può controllare la scadenza e inviare un avviso via email. Il comando

Comando
#!/bin/bash
DOMAIN="example.com"
DAYS_LEFT=$(echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2 | xargs -I{} python3 -c "from datetime import datetime; print((datetime.strptime('{}', '%b %d %H:%M:%S %Y %Z') - datetime.utcnow()).days)")
if [ "$DAYS_LEFT" -lt 30 ]; then
    echo "Certificate for $DOMAIN expires in $DAYS_LEFT days" | mail -s "SSL Warning" admin@example.com
fi

Il risultato finale

I problemi relativi ai certificati sono prevedibili e prevenibili. I principali (scadenza, mancata corrispondenza del dominio, catena incompleta) vengono tutti visualizzati chiaramente in un controllo SSL.

Esegui un controllo su qualsiasi dominio con il file Strumento di controllo SSL. Per i server di produzione, configura il monitoraggio della scadenza con una finestra di avviso di almeno 30 giorni. E se utilizzi ancora TLS 1.0 o 1.1, disabilitali: qualsiasi server moderno dovrebbe essere solo TLS 1.2+.