====== Runbook: Rinnovo certificato ======
**Durata:** ~15 minuti \\
**Ruolo:** Operatore PKI \\
**Trigger:** Avviso scadenza (30/14/7 giorni)
----
===== Workflow =====
flowchart TD
A[Avviso scadenza] --> B{Chiave compromessa?}
B -->|Sì| C[Runbook revoca]
B -->|No| D{Stessa coppia di chiavi?}
D -->|Sì| E[Re-Certification]
D -->|No| F[Re-Key]
E --> G[Nuovo certificato]
F --> H[Nuovo CSR]
H --> G
G --> I[Archiviare vecchio certificato]
I --> J[Distribuire nuovo certificato]
J --> K[Aggiornare monitoring]
style B fill:#ffebee
style G fill:#e8f5e9
style J fill:#e3f2fd
----
===== Passo 1: Identificare certificati in scadenza =====
# Tutti i certificati con scadenza < 30 giorni
find /etc/ssl/certs -name "*.pem" -exec sh -c '
enddate=$(openssl x509 -enddate -noout -in "$1" 2>/dev/null | cut -d= -f2)
if [ -n "$enddate" ]; then
expiry=$(date -d "$enddate" +%s 2>/dev/null)
now=$(date +%s)
days=$(( (expiry - now) / 86400 ))
if [ "$days" -lt 30 ]; then
echo "$1: $days giorni"
fi
fi
' _ {} \;
# PowerShell: Trovare certificati in scadenza
Get-ChildItem Cert:\LocalMachine\My | Where-Object {
$_.NotAfter -lt (Get-Date).AddDays(30)
} | Select-Object Subject, NotAfter, Thumbprint
----
===== Passo 2: Scegliere metodo di rinnovo =====
| Metodo | Quando usare | Vantaggio |
|---------|----------------|---------|
| **Re-Certification** | Chiave sicura, nessuna modifica | Veloce, nessun re-deploy |
| **Re-Key** | Nuova lunghezza chiave, cambio policy | Maggiore sicurezza |
| **Replace** | Nuovo algoritmo (→ PQ) | A prova di futuro |
----
===== Passo 3a: Re-Certification (stessa coppia di chiavi) =====
# Generare CSR da certificato esistente + chiave
openssl x509 -x509toreq -in old_cert.pem -signkey private.key -out renew.csr
# Emettere nuovo certificato
openssl ca -config openssl.cnf \
-extensions server_cert \
-in renew.csr \
-out renewed_cert.pem \
-days 365 \
-notext
----
===== Passo 3b: Re-Key (nuova coppia di chiavi) =====
# Generare nuova chiave (EC P-384)
openssl ecparam -genkey -name secp384r1 -out new_private.key
# Nuovo CSR con stesso Subject
openssl req -new -key new_private.key -out rekey.csr \
-subj "$(openssl x509 -in old_cert.pem -subject -noout | sed 's/subject=//')"
# Emettere certificato
openssl ca -config openssl.cnf \
-extensions server_cert \
-in rekey.csr \
-out rekeyed_cert.pem \
-days 365
----
===== Passo 3c: Replace (Upgrade a Hybrid/PQ) =====
// Migrazione a modalità ibrida
using var oldCert = new X509Certificate2("old_cert.pfx", "password");
// Nuova coppia di chiavi (ML-DSA-65 per Hybrid)
using var mlDsa = MlDsaSigner.Create(MlDsaParameterSet.MlDsa65);
using var ecdsa = ECDsa.Create(ECCurve.NamedCurves.nistP384);
var request = new CertificateRequest(
oldCert.SubjectName,
ecdsa,
HashAlgorithmName.SHA384);
// Copiare estensioni
foreach (var ext in oldCert.Extensions)
request.CertificateExtensions.Add(ext);
// Creare certificato ibrido
var newCert = request.CreateSelfSigned(
DateTimeOffset.UtcNow,
DateTimeOffset.UtcNow.AddDays(365),
CryptoMode.Hybrid);
----
===== Passo 4: Archiviare vecchio certificato =====
# Archiviare con metadati
ARCHIVE_DIR="/var/archive/certs/$(date +%Y)"
mkdir -p "$ARCHIVE_DIR"
# Certificato + metadati
cp old_cert.pem "$ARCHIVE_DIR/$(openssl x509 -serial -noout -in old_cert.pem | cut -d= -f2).pem"
# Log archivio
echo "$(date -Iseconds) RENEWED $(openssl x509 -serial -noout -in old_cert.pem)" >> /var/log/cert-archive.log
----
===== Passo 5: Deployment =====
| Sistema | Metodo deployment | Riavvio necessario |
|--------|-------------------|----------------------|
| Apache | ''cp cert.pem /etc/ssl/; systemctl reload apache2'' | No |
| Nginx | ''cp cert.pem /etc/nginx/ssl/; nginx -s reload'' | No |
| IIS | ''Import-PfxCertificate; netsh http update'' | No |
| Kubernetes | ''kubectl create secret tls'' | Restart Pod |
# Apache/Nginx Reload
systemctl reload apache2
# oppure
nginx -s reload
# Test connessione
openssl s_client -connect server.example.com:443 -brief
----
===== Passo 6: Aggiornare monitoring =====
# Inserire nuovo fingerprint nel monitoring
NEW_FP=$(openssl x509 -fingerprint -sha256 -noout -in renewed_cert.pem | cut -d= -f2)
echo "Nuovo fingerprint: $NEW_FP"
# Aggiornare alert Prometheus (se basato su fingerprint)
# La data di scadenza nel monitoring dovrebbe aggiornarsi automaticamente
----
===== Checklist dopo il rinnovo =====
| # | Punto di verifica | Comando | |
|---|-----------|--------|---|
| 1 | Nuovo certificato attivo | ''openssl s_client -connect host:443'' | |
| 2 | Catena completa | ''openssl verify -CAfile chain.pem cert.pem'' | |
| 3 | Vecchio certificato archiviato | ''ls /var/archive/certs/'' | |
| 4 | Ticket chiuso | Sistema ticket | |
| 5 | Monitoring aggiornato | Verificare dashboard | |
----
===== Risoluzione problemi =====
| Problema | Causa | Soluzione |
|---------|---------|--------|
| ''certificate has expired'' | Reload dimenticato | Riavviare servizio |
| ''certificate chain incomplete'' | Manca intermediate | ''cat cert.pem intermediate.pem > fullchain.pem'' |
| ''hostname mismatch'' | SAN non aggiornato | CSR con SAN corretti |
| Client non si fida | CA non nello store | Distribuire certificato CA |
----
===== Runbook correlati =====
* [[.:zertifikat-ausstellen|Emissione certificato]] - Nuovi certificati
* [[.:zertifikat-widerrufen|Revoca certificato]] - In caso di compromissione
* [[..:automatisierung:scheduled-renewal|Rinnovo automatico]] - Automazione
----
<< [[.:zertifikat-ausstellen|Emissione certificato]] | [[.:zertifikat-widerrufen|Revoca certificato]] >>
----
//Wolfgang van der Stille @ EMSR DATA d.o.o. - Post-Quantum Cryptography Professional//
{{tag>runbook certificato rinnovo renewal operator}}