Back to Mass Revocation Blog Post
ARIRFC 9773Compliance

ARI Readiness Guide

ACME Renewal Information (RFC 9773) — the protocol that lets your CA tell your ACME client when to renew, including emergency 'renew now' signals during mass revocation events. This guide covers how ARI works, which clients support it, and how to set it up.

12 min readApril 2026Implementation Guide
ARI Readiness Guide — ACME Renewal Information timeline showing certificate renewal signaling

What ARI Is and Why It Matters Now

ACME Renewal Information (ARI) is a protocol extension defined in RFC 9773, published June 2025. It was developed by the Internet Security Research Group (ISRG) — the organization behind Let's Encrypt — after their 2020 mass revocation of 3 million certificates exposed a critical gap: there was no mechanism for a CA to tell ACME clients "renew this certificate now."

ARI serves two purposes:

  • Normal operation: The CA provides optimized renewal timing to spread load across its infrastructure and avoid thundering-herd renewal patterns.
  • Emergency signaling: During a compliance incident or misissuance event, the CA shortens the renewal window to signal that affected certificates must be replaced immediately.
September 2024 reality check: Let's Encrypt discovered a compliance issue affecting 133,613 certificates and used ARI to signal emergency renewals. Only about 5.6% of affected certificates renewed via ARI. The other 94% weren't listening. The protocol works — the adoption doesn't. This guide helps you close the gap.

For the full context on recent mass revocation events, read the companion blog post: 1.7 Million Certificates Revoked in 24 Hours.

How ARI Works: The Protocol Flow

ARI adds a renewalInfo endpoint to the ACME server. Here's the complete flow:

1Client Polls renewalInfo

Your ACME client constructs an ARI CertID from the certificate's Authority Key Identifier (AKI) and serial number, then sends an unauthenticated GET request:

GET {directory.renewalInfo}/{ARI-CertID}

# Example:
GET https://acme-v02.api.letsencrypt.org/get/ari-certID/
  aYhDn6RYOi9LQPRvMi-nqWJ1kk00YFNXBgWv3YCb1nw.AIdlQyE

2CA Responds with suggestedWindow

The CA returns a renewal window — start and end timestamps — indicating when the certificate should be renewed. The response also includes a Retry-After header telling the client how often to re-poll.

HTTP/1.1 200 OK
Content-Type: application/json
Retry-After: 21600

{
  "suggestedWindow": {
    "start": "2026-06-15T00:00:00Z",
    "end": "2026-06-16T00:00:00Z"
  }
}

Normal operation: The window is near the end of the certificate's lifetime (roughly ⅔ through for Let's Encrypt).

Emergency signal: The window start and end are in the past — this means renew immediately.

Retry-After: Let's Encrypt currently returns 21,600 seconds (6 hours). The RFC specifies that clients MUST re-poll after this interval.

3Client Selects a Random Time Within the Window

The RFC specifies selecting a uniformly random time within the suggestedWindow to spread renewal load across the CA's infrastructure and avoid thundering-herd spikes. If the window has already passed, skip the random selection and renew immediately.

4Client Sends New Order with replaces Field

When renewing in response to an ARI signal, the client includes a replaces field identifying which certificate is being replaced:

POST /acme/new-order
Content-Type: application/jose+json

{
  "identifiers": [
    { "type": "dns", "value": "example.com" }
  ],
  "replaces": "aYhDn6RYOi9LQPRvMi-nqWJ1kk00YFNXBgWv3YCb1nw.AIdlQyE"
}

This allows the CA to: revoke the predecessor immediately, waive rate limits that would otherwise block bulk renewals, and track replacement progress during mass revocation events.

The RFC says clients SHOULD include this field when a clear predecessor exists.

5Client Re-polls After Retry-After Interval

Even after successful renewal, the client continues polling for all managed certificates. The loop must run continuously — not just once after renewal.

The fundamental tension: The entire flow assumes the client is checking regularly. A cron job that runs weekly can't respond to a 6-hour Retry-After interval. This is the architectural tension at the core of ARI adoption — and it's why the execution model of your ACME client matters as much as whether it "supports ARI."

ACME Client ARI Support

Not all ACME clients are created equal when it comes to ARI. Here's what actually works today:

ClientARI PollingreplacesExecution ModelEmergency Response
Certbot (v4.1.0+)Cron / systemd timer
CaddyLong-lived service
Lego (v4.16+)CLI / cron
win-acmeScheduled task / service
Certify The WebWindows service (2×/day)
acme.shCron
cert-manager (K8s)Controller

For a full comparison across all criteria — not just ARI — see the ACME Client Selection Checklist.

Certbot (v4.1.0+)

The most widely deployed ACME client. ARI support landed in v4.1.0 (June 2025). It checks the renewalInfo endpoint during certbot renew and will trigger early renewal if the suggested window has passed.

Two limitations: (1) it only checks when the cron job or systemd timer fires — if that's every 12 hours or weekly, there's a gap between the CA's signal and your response; (2) it does not send the replaces field, so the CA can't revoke the predecessor immediately or waive rate limits.

Caddy

Runs as a long-lived process with full ARI support including the replaces field. This is the closest to the RFC's intended client architecture — it polls continuously rather than on a cron schedule, responding to emergency signals in near-real-time.

acme.sh — No ARI Support

The second most popular ACME client has no ARI support at all. GitHub issue #4944 has been open since January 2024 with no implementation timeline. During a mass revocation event, acme.sh users discover the problem through email or news, then manually run --renew --force for each affected certificate.

cert-manager (Kubernetes) — No ARI Support

Widely used in cloud-native environments. Feature request #6010 for ARI has been open since May 2023. No implementation yet. This is a significant gap — Kubernetes environments managing hundreds or thousands of certificates through cert-manager have no automated mass revocation response mechanism. Monitor the issue and plan for manual intervention.

Setting Up ARI in Your Environment

Certbot

  1. Verify your version (must be 4.1.0+):
    certbot --version
  2. Check your systemd timer frequency:
    systemctl list-timers certbot*
  3. The default Certbot systemd timer runs twice daily — this is adequate for most scenarios.
  4. If running via cron, verify your schedule:
    crontab -l | grep certbot
  5. Recommendation: Increase to every 6 hours if managing critical services, matching Let's Encrypt's Retry-After value:
    # Add to crontab:\n0 */6 * * * certbot renew --quiet
  6. No additional configuration is needed — ARI is enabled by default when the CA supports it.

Caddy

ARI is enabled by default. No configuration needed. Caddy manages certificates automatically when you configure HTTPS. Verify your version with:

caddy version

acme.sh Users — Migration Path

  • Short term: Increase cron frequency to every 6 hours and monitor your CA's incident channels manually.
  • Medium term: Evaluate migrating critical certificates to a client with ARI support (Certbot, Caddy, or Lego).
  • The --renew --force command is your emergency fallback, but it requires manual identification of affected certificates.

cert-manager (Kubernetes) — Workaround

  • No native ARI support yet — monitor cert-manager issue #6010.
  • Workaround: Monitor Let's Encrypt community forum and CA incident channels; use kubectl cert-manager renew to force renewal of specific Certificate resources:
    # Force renew a specific certificate:\nkubectl cert-manager renew my-certificate -n my-namespace\n\n# Force renew all certificates in a namespace:\nkubectl cert-manager renew --all -n my-namespace
  • For critical workloads, consider running a sidecar or CronJob that polls the ARI endpoint externally and triggers cert-manager renewals via the API.

Testing Your ARI Readiness

Run through these five verification steps to confirm your environment is ready:

1Check That ARI Is Being Used

For Certbot, run a dry run and look for ARI-related log messages showing renewal timing based on ARI vs. static expiry threshold:

certbot renew --dry-run -v 2>&1 | grep -i 'ari\|renewal\|window'

2Verify Your Polling Interval

Match or exceed the CA's Retry-After value. For Let's Encrypt, that's 6 hours. If your certbot renew cron runs less frequently, you have a gap.

3Simulate an Emergency Renewal

Force-renew a non-critical certificate and time the end-to-end process:

time certbot renew --force-renewal --cert-name your-domain.com

From command execution to new certificate deployed — how long? If that number is measured in hours for a single certificate, multiply by your total certificate count.

4Check Certificate Deployment Automation

ARI handles the renewal trigger, but does your post-renewal hook reload the web server? Does your load balancer pick up the new cert automatically? Check your deploy hooks:

# Certbot post-renewal hooks:\nls /etc/letsencrypt/renewal-hooks/deploy/\n\n# Or check renewal config:\ngrep -r 'post_hook\\|deploy_hook' /etc/letsencrypt/renewal/

5Monitor Your CA's Incident Channels

ARI is the signal mechanism. Your CA's community forum and Bugzilla are the context mechanism. You need both. Subscribe to the Let's Encrypt community forum, Mozilla Bugzilla CA compliance, and your commercial CA's status page.

ARI + Shorter Lifetimes = Non-Negotiable Automation

As certificate lifetimes drop to 47 days (46 actual issued) under SC-081v3, the renewal cycle itself becomes the dominant operational concern. ARI doesn't just protect against mass revocation — it optimizes normal renewal timing and distributes load across the CA's infrastructure.

The clients and configurations you set up now for ARI readiness are the same infrastructure that will handle 47-day certificates smoothly. The teams that treat ARI as optional today will be the ones scrambling when shorter lifetimes are mandatory.