====== 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}}