ACME clients and automation

How to choose and request a Let's Encrypt certificate profile

By · Last verified

You choose a Let's Encrypt profile with one client option, such as --preferred-profile tlsserver in Certbot, and then make renewal timing fit that profile's lifetime. classic certificates last 90 days, tlsserver 45 days and shortlived about 6 days.

Profile selection follows the IETF draft on ACME profiles and works with Certbot 4.0+, acme.sh 3.1.2+, lego v5, Caddy 2 (experimental option), Traefik v3, cert-manager 1.18+ and the Nginx ACME module 0.3.0+.

Prerequisites

Profiles change how short-lived certificates are, so renewal must already be automatic.

  • An ACME client at or above the versions listed above.
  • A scheduler that runs renewal at least daily; for shortlived, at least twice a day is safer.
  • Software that does not depend on the certificate's subject Common Name (relevant to tlsserver and shortlived).

Step 1: Compare the profiles

classic stays the default; tlsserver and shortlived are opt-in profiles with shorter lifetimes and fewer certificate fields:

Profile Lifetime Names Common Name Notes
classic 90 days; 64 days from Feb 10, 2027; 45 days from Feb 16, 2028 up to 100 DNS names included default when no profile is requested
tlsserver 45 days up to 25 DNS names omitted short authorization reuse (7 hours)
shortlived 160 hours up to 25 DNS or IP names omitted no revocation information required

The former tlsclient profile was retired on July 8, 2026, and the classic profile stopped including the TLS Client Authentication EKU on February 11, 2026. Use a private CA for client certificates.

Step 2: Check what the server offers

The ACME directory lists the profiles Let's Encrypt offers in its profiles object:

curl -s https://acme-v02.api.letsencrypt.org/directory | python3 -m json.tool | grep -A6 '"profiles"'

The staging directory at https://acme-staging-v02.api.letsencrypt.org/directory lists the same profiles; use it to test.

Step 3: Configure your client

Each client takes the profile name as a single option or setting.

Certbot 4.0+ (the choice is saved for renewals from 4.1):

sudo certbot certonly --nginx -d example.com --preferred-profile tlsserver

--required-profile fails instead of falling back when the server does not offer the profile.

acme.sh 3.1.2+:

acme.sh --issue --server letsencrypt -d example.com --dns dns_cf --cert-profile tlsserver

lego v5:

lego run --accept-tos --path /etc/lego --dns cloudflare -d example.com --profile tlsserver

Caddy (marked experimental):

example.com {
    tls {
        issuer acme {
            profile tlsserver
        }
    }
}

Traefik v3 static configuration (also set certificatesDuration in hours so renewal timing matches):

certificatesResolvers:
  le:
    acme:
      email: admin@example.com
      storage: /letsencrypt/acme.json
      profile: tlsserver
      certificatesDuration: 1080
      httpChallenge:
        entryPoint: web

cert-manager 1.18+ (spec.acme.profile on the Issuer or ClusterIssuer):

spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    profile: tlsserver

Nginx ACME module 0.3.0+, inside acme_issuer:

profile tlsserver;

Verify

After the next issuance, a tlsserver certificate shows a validity window of 45 days and an empty subject. Confirm the lifetime and the missing CN with the SSL checker, or from any terminal:

curl ssl.sh/example.com
openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -dates

The validity calculator shows when renewal should happen.

Automatic renewal

With a shorter profile, renewal has to follow the certificate lifetime or ARI instead of a fixed number of days. Certbot 4.0+ renews when one third of the lifetime remains (one half if the lifetime is under 10 days) and Certbot 4.1+ follows ARI; acme.sh 3.1.4+ and lego v5 follow ARI by default; Caddy follows ARI. Remove any hard-coded "renew 30 days before expiry" settings, which would renew a 45-day certificate on almost every run and are impossible for 6-day certificates. With acme.sh, an explicit --days overrides ARI since 3.1.5, so leave it unset unless you need it. Add the domain to ssl.sh monitoring (in development) so a stalled renewal is caught within days.

Troubleshooting

  • account is not permitted to use certificate profile: the profile is not open to your account or environment; check the directory listing and Let's Encrypt announcements.
  • unrecognized arguments: --preferred-profile (or similar): the client predates profile support; upgrade it.
  • Client shows a next renewal date 60 days out for a 6-day certificate: the client assumes 90-day lifetimes; rely on ARI or set renewal timing explicitly, and verify with monitoring.
  • Legacy software reports an empty subject: it reads the CN; update it or stay on classic until February 2027.
  • Client certificate authentication stopped working: see client auth EKU removed.
  • Too many orders while testing: use the staging directory; see Let's Encrypt rate limits.

FAQ

Should I switch to tlsserver now?

Yes, if your renewal is fully automated and runs at least daily. Switching now lets you find problems before February 2027, when the default becomes 64 days, and February 2028, when it becomes 45 days. If any step is manual, fix that first; a shorter profile only makes manual steps fail sooner.

What breaks without a Common Name?

Browsers and modern TLS libraries validate only the Subject Alternative Name, so nothing on the public web. Old appliances, monitoring scripts or code that reads the subject CN to pick a certificate may need updating before you use tlsserver or shortlived.

When does the 6-day shortlived profile make sense?

When you want revocation to matter less (a compromised key is useless within days) or need an IP address certificate, which Let's Encrypt issues only under shortlived. It requires renewal every few days, so it is only safe with a client that follows ARI or renews at half the lifetime.

How can I see which profiles are available?

Read the profiles object in the ACME directory: curl -s https://acme-v02.api.letsencrypt.org/directory. Let's Encrypt describes the directory as the canonical list; acme.sh also has --list-profiles.

Sources

  1. Let's Encrypt: Profiles
  2. Let's Encrypt: Decreasing Certificate Lifetimes to 45 Days
  3. Let's Encrypt: Ending TLS Client Authentication Certificate Support
  4. Certbot User Guide
  5. acme.sh wiki: Profile selection
  6. lego: Commands & Flags
  7. Caddy: tls directive
  8. cert-manager: ACME
  9. nginx: Module ngx_http_acme_module