aman®
← all writeups

Every certificate expired at midnight

cert-manager had been failing renewals silently for sixty days. We found out when the ingress started serving expired certs to every client.

Date
2026-08-02
Type
incident
Severity
SEV1
Duration
2h 05m
Impact
All public HTTPS endpoints returned certificate errors for ~95 minutes.

PLACEHOLDER POST — seed data. Replace with your real writeup.

At 00:00 UTC the wildcard certificate for every public hostname expired. Browsers refused to connect, mobile clients hard-failed, and the status page (behind the same ingress) went down with everything else.

Timeline

Time Event
00:00 Certificate *.example.com expires
00:04 Synthetic checks fail across all regions
00:19 Confirmed expiry, not a CA outage
01:10 Found the Challenge objects stuck in pending since June
01:42 Manual DNS-01 issuance succeeds, secret rotated
02:05 All endpoints healthy, incident closed

The actual cause

A DNS provider API token was rotated during a security cleanup. cert-manager’s DNS-01 solver started getting 403 on every renewal attempt, logged it at info, and retried forever. The old certificate kept working for sixty days, so nothing looked wrong.

kubectl get certificates -A -o wide | grep -v True
kubectl describe challenge -n ingress   # "403 Forbidden" every 15 minutes since June

What changed

  • Alert on certmanager_certificate_expiration_timestamp_seconds below 21 days
  • Alert on any Certificate with Ready=False for more than an hour
  • Solver credentials moved into the secret-rotation runbook, with a test issuance step

Expiry was never the problem. Sixty days of silence was.


← all writeups