Certificate Rotation Strategies for Zero Downtime in the Era of 90-Day Validity

The landscape of Certificate Lifecycle Management (CLM) is undergoing a seismic shift. For years, DevOps teams and IT administrators operated on a comfortable annual rhythm: buy a certificate, install...

Tim Henrich
February 25, 2026
7 min read
38 views

Certificate Rotation Strategies for Zero Downtime in the Era of 90-Day Validity

The landscape of Certificate Lifecycle Management (CLM) is undergoing a seismic shift. For years, DevOps teams and IT administrators operated on a comfortable annual rhythm: buy a certificate, install it, and forget about it for 365 days.

That era is ending.

With Google and major browser root programs aggressively pushing to reduce public TLS certificate validity from 398 days to 90 days, the margin for error is shrinking. While this shift improves security by reducing the window of compromise for stolen keys, it quadruples the operational workload. If you are still rotating certificates manually, you aren't just inefficient—you are creating a single point of failure.

In 2025, "Zero Downtime" is no longer about remembering to renew; it is about architecting systems that can handle frequent, automated, and non-disruptive cryptographic swaps without dropping a single active connection.

This guide explores the technical architecture required to achieve zero-downtime certificate rotation, ensuring your transition to short-lived certificates is seamless.

The Anatomy of a Downtime-Free Rotation

To understand how to prevent downtime, we must first understand what causes it during a rotation event.

When a standard web server (like NGINX, Apache, or a Go application) starts, it loads the SSL/TLS certificate and private key from the disk into memory. It then binds to a port (usually 443) and begins accepting connections.

If you overwrite the certificate file on the disk, the running process does not automatically know about it. It continues serving the old certificate stored in RAM. To apply the change, you typically restart the service.

The downtime occurs here:
1. Hard Restart: The process kills all active connections (severing user downloads or API calls) and restarts.
2. Startup Latency: The application takes seconds or minutes to initialize, during which the port is unreachable.

Achieving zero downtime requires decoupling the installation of the certificate from the interruption of the service.

Strategy 1: Edge Termination (The Gold Standard)

The most robust strategy for zero downtime is to remove certificate management from your application servers entirely. By offloading TLS termination to a Load Balancer or Reverse Proxy at the edge, you centralize the rotation logic.

How It Works

  1. Upload: You upload the new certificate to the Load Balancer (e.g., AWS ALB, F5, or a dedicated NGINX ingress).
  2. Transition: The Load Balancer updates its listener configuration.
  3. Connection Handling:
    • New Connections: The LB immediately serves the new certificate to any new client requests.
    • Existing Connections: The LB keeps established sockets open using the old certificate context until the client naturally disconnects or the session times out.

Implementation Context

Cloud providers make this seamless. For example, if you are using AWS Certificate Manager (ACM), the certificate is automatically renewed and deployed to the Elastic Load Balancer (ELB). The ELB handles the connection draining logic natively, ensuring zero dropped packets.

However, if you are managing your own edge (e.g., HAProxy or NGINX), you must configure the "graceful reload" logic manually (see Strategy 3).

Strategy 2: Kubernetes & Rolling Updates

In Kubernetes environments, certificates are often stored as Secrets and mounted into Pods. The challenge is that updating a Secret does not automatically trigger a Pod restart.

The "brute force" method is to delete the Pods, forcing the ReplicaSet to spin up new ones. If not managed correctly, this causes downtime. The zero-downtime approach utilizes Rolling Updates.

The Workflow

  1. Cert-Manager: Use cert-manager to automate the issuance of certificates from Let's Encrypt or HashiCorp Vault. It saves the certificate to a Kubernetes Secret.
  2. Reloader: Use a tool like Reloader to watch for changes in Secrets.
  3. Rolling Deployment: When the Secret changes, Reloader triggers a rolling update of the Deployment.

Code Example: Configuring Reloader

To ensure zero downtime, your Deployment configuration must allow for an overlap where old and new pods exist simultaneously.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
  annotations:
    # This annotation tells Reloader to watch the secret
    secret.reloader.stakater.com/reload: "my-tls-secret"
spec:
  replicas: 3
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 0  # Ensure we never drop below desired capacity
      maxSurge: 1        # Create a new pod before killing an old one
  template:
    spec:
      containers:
      - name: web
        image: nginx
        volumeMounts:
        - name: tls-certs
          mountPath: "/etc/ssl/certs"
          readOnly: true
      volumes:
      - name: tls-certs
        secret:
          secretName: my-tls-secret

Why this works: Kubernetes spins up a new Pod with the new certificate. It waits for the Readiness Probe to pass. Only then does it terminate the old Pod. The Service mesh/Ingress routes traffic seamlessly during the handoff.

Strategy 3: Graceful Reloads (Linux & NGINX)

If you are running monolithic applications or managing bare metal servers, you cannot rely on orchestration to swap containers. You must instruct the application to reload its configuration without dropping the socket.

Most modern web servers support a "Graceful Reload" signal (usually SIGHUP).

NGINX Implementation

Do not run systemctl restart nginx. Instead, use the reload command.

# 1. Verify the new certificate syntax is valid
nginx -t

# 2. Trigger a graceful reload
nginx -s reload

What happens under the hood?
1. The NGINX master process reads the new configuration (and new certificate).
2. It forks new worker processes that use the new certificate.
3. It sends a signal to the old worker processes to stop accepting new connections but continue processing current requests until they finish.
4. Once the old requests are done, the old workers exit.

Automation with Certbot

If you use Certbot, you can automate this via the --deploy-hook flag. This ensures the reload happens specifically after a successful renewal.

certbot renew --deploy-hook "systemctl reload nginx"

The "Zombie Certificate" Problem

A major risk in automated rotation is the "Zombie Certificate." This occurs when your automation tool successfully renews the certificate file on the disk, but the service fails to reload.

  • Disk State: Certificate expires in 89 days (New).
  • Memory State: Certificate expires in 1 hour (Old).

If you only monitor the file system (checking the file creation date), your dashboard will show "Green/Healthy." Meanwhile, your users are about to hit an expiration error.

The Solution: External Verification

You must monitor what the port is serving, not just what the disk is holding. This is where external monitoring becomes critical.

Tools like Expiring.at monitor the public-facing endpoint. By performing a TLS handshake from an external source, you verify exactly what your customers are seeing. If your automation updates the file but NGINX hangs on the reload, Expiring.at detects the old expiration date on the port and alerts you before the outage occurs.

Handling Mobile Apps and Certificate Pinning

Zero downtime strategies often fail when mobile applications or strict APIs are involved due to Certificate Pinning.

If your mobile app hard-codes the hash of your leaf certificate (the public key pinning), every rotation is an outage. When you rotate the certificate, the hash changes, and the app rejects the connection immediately.

Best Practice for 2025:
* Stop pinning leaf certificates. It is incompatible with short-lived (90-day) certificates.
* Pin the Intermediate or Root CA. This allows you to rotate the leaf certificate as often as needed (daily, even) without breaking the app, as long as the issuer remains the same.
* Backup Pins: Always include a backup pin for a different CA in your app code. If your primary CA has an issue or you need to switch providers, you won't brick your installed base.

Summary: The Zero Downtime Checklist

As we move toward a default 90-day validity period, treat certificate rotation as a continuous operational process rather than an annual event.

  1. Decouple: Move TLS termination to a Load Balancer where possible.
  2. Overlap: Configure Rolling Updates in Kubernetes with maxUnavailable: 0.
  3. Reload, Don't Restart: Use nginx -s reload or kill -HUP to preserve active sockets.
  4. Buffer: Configure automation to renew at 60 days (leaving a 30-day safety buffer).
  5. Verify Externally: Use Expiring.at to monitor the actual endpoint, ensuring the new certificate is loaded in memory and correctly served to the world.

By implementing these strategies now, you inoculate your infrastructure against the increasing velocity of cryptographic changes and ensure that "certificate expiration" never appears on your incident report again.

Share This Insight

Related Posts