Skip to main content

    ACME Challenge Types: Which One Your Setup Can Actually Use

    HTTP-01, DNS-01, TLS-ALPN-01 and the newer dns-persist-01. Which ACME challenge your infrastructure permits, and why that choice now decides renewals.

    MS
    My-SSL Team
    ·
    14 min read
    ·
    Published August 24, 2026
    ·
    Last updated August 24, 2026

    The short answer

    ACME has three validation challenges in general use, http-01 over port 80, dns-01 via a TXT record, and tls-alpn-01 over port 443, plus a fourth, dns-persist-01, that began reaching production in 2026. Which one you can use is decided by your infrastructure rather than your preference: a wildcard forces dns-01, a closed port 80 rules out http-01, and a host the internet cannot reach rules out both http-01 and tls-alpn-01. That choice matters more each year, because the CA/Browser Forum schedule that cuts certificate lifetimes to 47 days by March 2029 also cuts how long a certificate authority may reuse a completed domain validation, from 398 days to 10.

    The four ACME challenge types, what each one demands of your infrastructure, and what rules it outFour panels compare ACME validation challenges. HTTP-01 needs an inbound connection on port 80 to a file under the well-known ACME challenge path, cannot issue wildcards, and is ruled out by a closed port 80 or a host the internet cannot reach. DNS-01, highlighted, needs the ability to write a TXT record at the underscore ACME challenge name, is the only challenge that can issue a wildcard, works for hosts with no public address, and is ruled out only by DNS you cannot change programmatically. TLS-ALPN-01 needs control of whatever terminates TLS on port 443 and answers a handshake using the acme-tls slash 1 protocol, cannot issue wildcards, and is ruled out by a managed load balancer or CDN you cannot configure. DNS-PERSIST-01 needs one long-lived TXT record naming a certificate authority and an ACME account, and is ruled out mainly by availability, since support is still arriving CA by CA. A footer notes that the choice is usually made by these constraints rather than by preference.You rarely choose a challenge. Your infrastructure chooses it for you.http-01 · RFC 8555NEEDSAn inbound request on port 80to /.well-known/acme-challenge/RULED OUT BYClosed port 80. A private host.Any wildcard name.Wildcards: nodns-01 · RFC 8555NEEDSA TXT record written at_acme-challenge.<name>RULED OUT BYDNS you cannot change froma script. Nothing else.Wildcards: only this onetls-alpn-01 · RFC 8737NEEDSControl of the TLS terminatoron 443, answering acme-tls/1RULED OUT BYA CDN or managed balanceryou do not configure.Wildcards: nodns-persist-01 · IETF draftNEEDSOne long-lived TXT recordnaming a CA and an accountRULED OUT BYAvailability, support isstill arriving CA by CA.Wildcards: per CA policyStart from what your setup forbids. Whatever is left is your shortlist.
    Read the "ruled out by" line first. Most arguments about challenge types end the moment someone mentions a wildcard or a host with no public address.

    What a challenge actually proves

    An ACME challenge proves one narrow thing: that whoever holds a particular account key also controls a particular name, right now. It says nothing about who owns the domain, what organisation stands behind it, or whether the request is a good idea. The certificate authority hands out a token, your client publishes something derived from that token where only a controller of the name could put it, and the authority goes and looks.

    Where the client publishes it is the entire difference between the challenge types. RFC 8555 defines two places: a file served over HTTP, and a DNS TXT record. RFC 8737 later added a third, a TLS handshake on port 443 that carries the proof inside the certificate the server presents. All three end in the same place: an authorization object marked valid, good for a while, which lets the account order certificates for that name.

    The phrase "good for a while" used to be the boring part. Under the old rules a completed validation could be reused for over a year, so a team could pass a challenge once, forget about it, and renew repeatedly on the strength of that one proof. That is the assumption the current schedule is dismantling, and it is why a decision that felt like a setup detail has become an architectural one.

    One more thing worth saying early, because it saves a lot of confusion: ACME is a protocol, not a Let's Encrypt product. Any certificate authority can expose an ACME endpoint, several commercial ones do, and the challenge types behave identically against all of them. What differs at a commercial authority is account setup: usually External Account Binding, where a key identifier and an HMAC key from your account tie ACME requests back to your billing relationship.

    HTTP-01, and the redirect rule nobody reads

    The http-01 challenge asks you to serve a file at /.well-known/acme-challenge/<token> containing the key authorization, and the certificate authority fetches it over plain HTTP on port 80. The port is not negotiable, ACME does not let a client nominate a different one, because allowing arbitrary ports would let anyone who can bind a high port on a shared host claim the whole name.

    That fixed port 80 is the source of most http-01 failures, and it gets blamed for a lot of failures it did not cause. The rule people get wrong is the redirect rule. Let's Encrypt follows redirects from that first request: up to ten hops, only to http: or https: URLs, and only to ports 80 or 443. It refuses redirects to bare IP addresses. And when a hop lands on HTTPS, it does not validate the certificate it finds there, which makes sense once you remember the request exists to obtain a working certificate in the first place.

    How an HTTP-01 request travels, and which redirects a certificate authority will followA flow diagram. The certificate authority sends a plain HTTP request on port 80 to the well-known ACME challenge path with a token. That first request must be on port 80 and cannot be redirected away from it by the client. From there the authority will follow redirects, and the highlighted box lists the limits Let's Encrypt applies: at most ten hops, only http or https targets, only ports 80 or 443, no redirect to a bare IP address, and no certificate validation on an HTTPS hop, because the request exists to obtain a valid certificate in the first place. The chain ends at the token file, whose contents must match the key authorization. A footer notes the practical consequence: a site that redirects all port 80 traffic to HTTPS normally validates with no exception rule at all.The first request is fixed. Everything after it is negotiable.Certificate authorityvalidation requestport 80http://example.com/.well-known/acme-challenge/<token>Plain HTTP. Port 80 is not configurable, the ACMEspecification does not let a client pick another port.Redirects are followed, within limits• Up to 10 hops• http: or https: targets only• Target port must be 80 or 443• No redirect to a bare IP address• The certificate on anhttps hop is not checked• Expired or self-signedon that hop is fineToken file served. Contents must equal the key authorization.So a blanket HTTP-to-HTTPS redirect usually needs no exception. A closed port 80 always does.
    The exception rule people add for /.well-known/acme-challenge/ on a redirecting site is usually unnecessary. Removing it is a fair test of whether port 80 was the real problem.

    The practical consequence: a site that redirects every port 80 request to HTTPS generally validates without any special case. The exception rule that so many nginx and IIS configurations carry for /.well-known/acme-challenge/ is, on Let's Encrypt at least, usually doing nothing. Other authorities set their own redirect limits, so read your CA's documentation before you rely on this. What no amount of redirect handling fixes is a port 80 that is closed at the firewall, because there is nothing to redirect from.

    http-01 also cannot issue a wildcard, and cannot validate a host that the certificate authority cannot reach, which rules it out for anything behind a VPN, on an internal network, or in a pre-production environment that never sees public traffic. Within those limits it remains the least trouble to run: no API credentials, no propagation delay, and when it fails you can reproduce the exact request with curl.

    Multiple servers behind a load balancer add one wrinkle. The authority may connect to any backend, so either every backend has to serve the same token file, or the challenge path has to be routed to one place that does. Sharing a webroot is the usual answer; terminating /.well-known/acme-challenge/ at the balancer and pointing it at a single host is the other. Setups where neither is possible tend to end up on dns-01.

    DNS-01: the only route to a wildcard

    The dns-01 challenge asks you to publish a TXT record at _acme-challenge.<name> whose value derives from the token and your account key. It is the only challenge that can validate a wildcard identifier, and that is a property of the specification rather than a policy any authority chose. Proving you run the web server at example.com tells nobody anything about who controls anything.example.com.

    Two other capabilities fall out of the same design. The certificate authority queries public DNS rather than your host, so dns-01 works for machines with no public address at all, internal services, appliances on a management VLAN, staging environments that never see the internet. And it works before a server exists, which matters when you want the certificate ready ahead of a cutover.

    If you are issuing wildcard certificates, dns-01 is not a preference you can revisit later; it is the mechanism, and any automation plan has to start from a DNS provider your client can write to. Our wildcard SSL certificate options cover which products fit that shape.

    The costs are real. Your ACME client now needs credentials that can write DNS records, and the typical provider API token can edit every record in the zone. Propagation adds latency and a class of flaky failure that http-01 does not have, particularly with providers whose authoritative servers take their time agreeing with each other. Most clients wait and re-check before telling the authority to look, and most dns-01 problems that look mysterious are really a client that did not wait long enough.

    The credential problem has a good answer, and it is under-used enough that it gets its own section further down.

    TLS-ALPN-01: when port 80 is closed

    RFC 8737 defines tls-alpn-01, which moves the proof into a TLS handshake on port 443. The authority connects with the ALPN protocol acme-tls/1 and an SNI value naming the identifier; your server answers with a self-signed certificate whose only subject alternative name is that identifier and which carries the validation value in an extension. No application data is exchanged, and the connection closes as soon as the handshake has carried the proof.

    It exists for one situation: port 80 is unavailable and you cannot change that. Some hosting environments simply do not offer it, some networks block it as policy, and some operators would rather not run anything on 80 at all. Because tls-alpn-01 never touches port 80, it also survives configurations that redirect or drop everything there.

    The requirement it brings is stricter than it first looks. Your software has to control the TLS handshake itself, not just sit behind something that terminates TLS for it. That works beautifully in Caddy, Traefik or a Go service using autocert, all of which can swap in the validation certificate for the duration of a handshake. It does not work at all if a CDN or a managed load balancer terminates TLS and you cannot make it speak acme-tls/1. Client support is narrower too: plenty of well-known ACME clients never implemented it.

    Like http-01, it cannot issue wildcards, and like http-01 it needs the host to be reachable from the internet. If you were hoping it would solve an internal-hostname problem, it will not; that remains dns-01 territory, or a private CA.

    dns-persist-01: validating once, not every time

    The three challenges above share an assumption: every validation is a fresh transaction, with a fresh token and a fresh record to publish and clean up. dns-persist-01 breaks that assumption. Instead of a per-issuance TXT record, you publish one long-lived record that names a specific certificate authority and a specific ACME account, and the authority reads it to confirm that authorization still stands.

    As of August 2026 the standing of this method is worth stating precisely, because it is newer than most documentation admits. The CA/Browser Forum approved the underlying validation method in ballot SC-088v3 in October 2025, adding it to the Baseline Requirements as method 3.2.2.4.22, "DNS TXT Record with Persistent Value". The IETF ACME working group adopted the corresponding draft the same month. Let's Encrypt published its rollout plan in February 2026, with staging first and production targeted for the second quarter of that year.

    What it buys you is the removal of a moving part. A per-issuance record means write access at renewal time, a propagation wait every cycle, and a cleanup step that sometimes does not happen. A persistent record is written once and then read; the ACME client no longer needs standing credentials to change DNS on every renewal. That is a meaningful simplification for anyone whose objection to dns-01 was the credential, and it becomes more attractive the more often validation has to happen.

    Treat availability as the open question. The draft is still a draft, support arrives authority by authority, and client support follows behind that. It is worth designing so you can adopt it, and worth checking your certificate authority's documentation for current status rather than assuming from an article, including this one.

    Your challenge is now checked from several places

    Multi-Perspective Issuance Corroboration changed how every one of these challenges is verified. Certificate authorities must now corroborate domain control, and the CAA check that runs alongside it, from several network vantage points in different parts of the world rather than from a single validator. The challenge you publish is unchanged; the number of parties looking at it is not.

    A quorum model governs the result, tolerating a limited number of perspectives that fail to corroborate depending on how many were used. The bar has been rising in phases. DigiCert, for one, updated its implementation in June 2026 to require corroboration from at least four remote network locations spanning at least two Regional Internet Registry regions, in line with the next phase of the CA/Browser Forum requirements.

    Single-perspective validation compared with multi-perspective issuance corroborationTwo panels. On the left, the older model: one validator in one location makes one request to the domain, and a regional block on any other path is invisible because nothing else is tried. On the right, the current model, highlighted: the primary validator plus several remote perspectives in different parts of the world each attempt the same check, and issuance requires enough of them to corroborate the result. One perspective blocked by a firewall rule, a web application firewall policy or a geographic restriction can now be the difference between issuance and failure. A footer notes that this applies to the HTTP-01 and DNS-01 challenges alike, and to CAA record checks.The same challenge, checked from more places than it used to be.Before: one vantage pointCAyour hostOne request. If it succeeds, thechallenge passes. A block on anyother network path is invisible.Now: primary plus remote perspectivesCAEUAPACblockedyour hostEnough perspectives must agree. Onegeo-block can now decide the outcome.This applies to http-01 and dns-01 alike, and to the CAA check that runs with them.Allowlists built around a single known validator address are the usual thing that breaks.
    If a challenge that worked for years began failing intermittently, check what your edge does to requests from regions you do not serve.

    For most people this is invisible. For a specific and unlucky group it is the reason a setup that worked for years started failing. If your edge allowlists a known validator address range, applies a WAF rule that treats unfamiliar regions as suspicious, geo-blocks countries you do not sell to, or rate-limits aggressively, then a check that used to pass on one connection now has to pass on several from places you were not expecting. Our explainer on multi-perspective issuance corroboration goes through the mechanics in more detail.

    dns-01 is not exempt. The lookups are DNS queries rather than HTTP requests, but they still come from multiple perspectives, which means split-horizon DNS, anycast configurations that answer differently by region, and resolvers that disagree during propagation can all produce a non-corroborating result. A record that is visible from your desk is not automatically visible from four other continents.

    The reuse window is shrinking faster than the certificate

    Ballot SC-081v3, which the CA/Browser Forum passed in April 2025, gets discussed almost entirely in terms of certificate lifetimes: 398 days down to 200 on 15 March 2026, to 100 on 15 March 2027, and to 47 on 15 March 2029. The same ballot cuts a second number on the same dates: how long a certificate authority may reuse a completed domain control validation, and that one falls further, ending at 10 days in 2029.

    Maximum certificate validity and maximum domain validation reuse, on the CA/Browser Forum schedule to 2029A four-column chart. Each column shows two bars: the maximum lifetime of a publicly trusted TLS certificate, and the maximum period a certificate authority may reuse a completed domain control validation. Before March 2026 both were 398 days. From 15 March 2026 both fall to 200 days. From 15 March 2027 both fall to 100 days. From 15 March 2029 the certificate lifetime is 47 days while validation reuse falls much further, to 10 days, shown highlighted. The gap in the final column is the point of the figure: a certificate renewed roughly every month will need its domain control proved several times within that month, so the challenge has to run unattended.Validation expires sooner than the certificate it justified.max certificate validitymax validation reuse398 / 398until Mar 2026200 / 20015 Mar 2026100 / 10015 Mar 202747 / 1015 Mar 2029By 2029 a 47-day certificate rests on a proof that goes stale in 10 days.
    The right-hand bar is the one that decides your architecture. A challenge you have to touch by hand is fine at 398 days and impossible at 10.

    Follow that to its conclusion. In 2029 a certificate valid for 47 days rests on a proof of domain control that goes stale in 10. Even if you renew only at the last responsible moment, the challenge has to succeed several times inside a single certificate's life. Anything in that path that needs a person (a ticket to the DNS team, an approval, someone remembering to open port 80 for an afternoon) will be triggered often enough to become the thing that breaks.

    This is the reason challenge choice deserves an architectural decision rather than a default. A challenge that is merely inconvenient at 398-day reuse becomes an operational liability at 10. It also explains the timing of dns-persist-01: a persistent authorization record is a direct answer to the problem of proving the same fact every week or two, forever.

    Worth being precise about one thing, since it causes unnecessary alarm: reuse periods bind the certificate authority, not you. Nothing about your live certificate changes when a validation expires. The effect lands on your next issuance, which will require a fresh challenge, and if that challenge cannot run unattended, your next issuance is where you will find out.

    Delegating _acme-challenge safely

    The standard objection to dns-01 is that the ACME client needs credentials which, with most DNS providers, can rewrite the entire zone. Putting a token like that on a web server is a genuinely poor trade. The answer is delegation, and it is supported by every certificate authority that follows the DNS standards, because it uses nothing more exotic than a CNAME.

    You create a CNAME at _acme-challenge.example.com pointing into a separate zone that holds nothing but challenge records. The ACME client gets credentials for that zone alone. When the certificate authority resolves the challenge name it follows the CNAME and reads the TXT record wherever it lands, exactly as ordinary DNS resolution requires. An NS record delegating the subtree to different nameservers achieves the same thing with more separation.

    Delegating the ACME challenge record to a separate zone so the ACME client never holds credentials for the main domainA three-part diagram. On the left, the production zone for example.com holds its normal records and one CNAME at the underscore ACME challenge name, pointing into a separate delegated zone. In the middle, the highlighted delegated zone contains nothing but challenge TXT records, and the ACME client holds an API credential scoped to that zone alone. On the right, the certificate authority resolves the underscore ACME challenge name, follows the CNAME into the delegated zone and reads the TXT record there. A footer notes the security result: a compromise of the ACME client can rewrite challenge records and nothing else, and because only one CNAME can exist per name, each name can delegate to a single solver.The ACME client never needs a key to your production zone.Zone: example.comA, AAAA, MX, TXT ..._acme-challengeCNAME then _acme-challenge.example.acme-zone.netWritten once, by a human.Zone: acme-zone.netNothing but challenge TXTrecords live here._acme-challenge.exampleTXT "..."ACME client credential isscoped to this zone only.Certificate authorityResolves the name, followsthe CNAME, reads the TXTrecord it finds there.A compromised ACME client can rewrite challenge records. It cannot touch your MX.One CNAME per name means one delegated solver per name, plan that before you have twenty.
    The CNAME is a one-time manual edit. After that the client only ever writes into a zone that holds nothing worth stealing.

    The security result is worth stating plainly: a compromise of the ACME client lets an attacker rewrite challenge records in a zone containing only challenge records. Your MX records, your production A records and your SPF policy are out of reach. cert-manager documents this pattern for Kubernetes, and the same shape works for certbot, lego, acme.sh and anything else that speaks dns-01.

    One constraint to plan around before it bites: only one CNAME can exist at a given name, so each name can delegate its challenge to exactly one solver. If two systems both want to answer challenges for the same hostname, one of them has to lose. Deciding that while you have three delegated names is easy; deciding it when you have two hundred is a migration.

    Choosing, in the order the constraints apply

    Work down the list and stop at the first line that matches. The order matters, because the earlier constraints are absolute and the later ones are preferences. Almost every real argument about challenge types is resolved by the first three questions, and the remaining choice is usually between something you can automate today and something you would rather run.

    If this is trueUseWhy
    You need a wildcarddns-01No other challenge may validate a wildcard identifier.
    The host is not reachable from the public internetdns-01The authority queries public DNS, never your host.
    Port 80 is closed and cannot be openedtls-alpn-01, else dns-01Needs control of whatever terminates TLS on 443.
    A CDN or managed balancer terminates TLS for youdns-01You cannot make their terminator speak acme-tls/1.
    DNS is manual, or a different team owns ithttp-01Needs no credentials and no propagation wait.
    None of the above applieshttp-01Fewest moving parts, and the easiest failure to reproduce.

    Two additions once the choice is made. Set up delegation on day one if you land on dns-01, because retrofitting it across a large estate is far more work than starting with it. And check whether your certificate authority offers an ACME endpoint at all before you plan around one: Certum, for instance, lets you activate an ordered SSL certificate for ACME from the certificate's details, and our SSL certificate range is worth reading with that in mind if automation is part of your requirements.

    Nothing stops you using more than one. A fleet where public web servers run http-01 and internal appliances run dns-01 is a reasonable outcome, not a sign of an inconsistent design. What is worth avoiding is a fleet where nobody can say which name uses which, because that is the estate where a shrinking reuse window finds the gaps first.

    FAQ

    Frequently Asked Questions

    Get instant answers to common questions about SSL certificates and our services.

    Still Have Questions?

    Our SSL experts are available 24/7 to help with any questions about certificates, installation, or technical issues.

    Check what a challenge actually produced

    A challenge that passes and a certificate that reaches the server are two different events, and the gap between them is where most automation quietly fails. Entering a hostname and reading back the leaf, the chain and the days remaining takes a few seconds, needs no account, and settles the question before you go digging through client logs.

    Check a certificate with the SSL checker