CA Migration Runbook
Learn how to move all certificates from one Certificate Authority to another. This comprehensive runbook covers inventory, planning, execution, and cleanup.
When to Use
- • Current CA is being distrusted (e.g., Entrust situation)
- • Switching CAs for cost or feature reasons
- • Consolidating certificates under one CA
- • Current CA contract ending
Do NOT Use For
- • Just renewing one certificate (use Certificate Renewal Runbook)
- • Emergency replacement needed (use Emergency Replacement Runbook)
Quick Reference (TL;DR)
- Phase 1: Inventory all certificates from current CA
- Phase 2: Set up new CA account and test validation
- Phase 3: Prioritize by expiration and criticality
- Phase 4: Migrate certificates one at a time
- Phase 5: Let old certs expire naturally (don't revoke unless compromised)
1Phase 1: Inventory Current State
Objective: Document all certificates that need to be migrated
Scan network for certificates:
# Using nmap to find SSL services
nmap -sV --script ssl-cert -p 443,8443,993,995 192.168.1.0/24
# Check specific host
echo | openssl s_client -connect server.example.com:443 -servername server.example.com 2>/dev/null | \
openssl x509 -noout -subject -issuer -datesCreate inventory spreadsheet:
# CSV columns:
# Domain, SANs, Expiration, Type, Issuer, Location, Owner, Priority, Status
# Example row:
# example.com, "www.example.com,api.example.com", 2025-03-15, DV, OldCA, nginx-prod-1, ops-team, High, Pending2Phase 2: Set Up New CA
Objective: Establish account and test processes with new CA
💡 For OV/EV certificates, org validation can take 1-5 days - start early
💡 Test with a non-production domain first to learn the process
💡 If using Let's Encrypt, set up certbot or ACME client and test automation
3Phase 3: Plan Migration
Objective: Create prioritized migration schedule
💡 Prioritization formula: (Days until expiry) × (Criticality weight)
💡 Low score = migrate first
💡 Build in buffer time - things always take longer than expected
4Phase 4: Execute Migration
Objective: Migrate certificates one at a time following standard procedure
Standard CSR generation:
openssl req -new -newkey rsa:2048 -nodes \
-keyout domain.key -out domain.csr \
-subj "/CN=domain.example.com"Deploy and verify:
# Create bundle
cat new-cert.crt intermediate.crt > bundle.crt
# Deploy (nginx example)
sudo cp bundle.crt /etc/ssl/certs/
sudo cp domain.key /etc/ssl/private/
sudo nginx -t && sudo systemctl reload nginx
# Verify
echo | openssl s_client -connect domain.example.com:443 2>/dev/null | \
openssl x509 -noout -issuer -dates💡 Do one certificate at a time to limit blast radius
💡 Have rollback plan ready (keep old cert accessible)
💡 Test in staging before production where possible
5Phase 5: Handle Old Certificates
Objective: Properly manage certificates from old CA
💡 Old certs can serve as emergency fallback until they expire
💡 Revocation is only needed if key was compromised
💡 Keep old certs documented for audit trail
6Phase 6: Post-Migration
Objective: Verify complete migration and update processes
Audit all certificates for new issuer:
# Check issuer for each domain in inventory
for domain in $(cat domains.txt); do
echo -n "$domain: "
echo | openssl s_client -connect $domain:443 -servername $domain 2>/dev/null | \
openssl x509 -noout -issuer | grep -o "O = [^,]*"
doneTroubleshooting
Problem: OV/EV validation taking too long
Solution: Contact new CA support. Ensure all required docs are submitted. Some CAs offer expedited validation.
Problem: Old CA won't release certificates/data
Solution: You don't need old CA cooperation - just issue new certs from new CA and deploy them.
Problem: Can't complete domain validation at new CA
Solution: Check DNS propagation, firewall rules, or try different validation method (DNS vs HTTP).
Problem: Some systems still showing old certificate
Solution: Check all servers/nodes, clear caches, verify config points to new cert files.
Problem: Wildcard cert covers dozens of services
Solution: Consider splitting into individual certs for better security. Migrate all at once during maintenance window.