]> git.kaiwu.me - haproxy.git/commit
MEDIUM: acme: add dns-01 DNS propagation pre-check
authorWilliam Lallemand <wlallemand@haproxy.com>
Tue, 24 Mar 2026 20:53:57 +0000 (21:53 +0100)
committerWilliam Lallemand <wlallemand@haproxy.com>
Mon, 30 Mar 2026 16:24:28 +0000 (18:24 +0200)
commit631fd5f99b328bbac0378b235b7d0480fc9d4937
treec512a3b678a6c6c00fdbea6dc1df798929bdc653
parent5dcfbc5fad6a7745e35253f9f5a7745adcf41e6e
MEDIUM: acme: add dns-01 DNS propagation pre-check

When using the dns-01 challenge type, TXT record propagation across
DNS servers can take time. If the ACME server verifies the challenge
before the record is visible, the challenge fails and it's not possible
to trigger it again.

This patch introduces an optional DNS pre-check mechanism controlled
by two new configuration directives in the "acme" section:

  - "dns-check on|off": enable DNS propagation verification before
    notifying the ACME server (default: off)
  - "dns-delay <time>": delay before querying DNS (default: 300s)

When enabled, three new states are inserted in the state machine
between AUTH and CHALLENGE:

  - ACME_RSLV_WAIT: waits dns-delay seconds before starting
  - ACME_RSLV_TRIGGER: starts an async TXT resolution for each
    pending authorization using HAProxy's resolver infrastructure
  - ACME_RSLV_READY: compares the resolved TXT record against the
    expected token; retries from ACME_RSLV_WAIT if any record is
    missing or does not match

The "acme_rslv" structure is implemented in acme_resolvers.c, it holds
the resolution for each domain. The "auth" structure which contains each
challenge to resolve contains an "acme_rslv" structure. Once
ACME_RSLV_TRIGGER leaves, the DNS tasks run on the same thread, and the
last DNS task which finishes will wake up acme_process().

Note that the resolution goes through the configured resolvers, not
through the authoritative name servers of the domain. The result may
therefore still be affected by DNS caching at the resolver level.
Makefile
include/haproxy/acme-t.h
include/haproxy/acme_resolvers-t.h [new file with mode: 0644]
include/haproxy/acme_resolvers.h [new file with mode: 0644]
include/haproxy/obj_type-t.h
include/haproxy/obj_type.h
src/acme.c
src/acme_resolvers.c [new file with mode: 0644]
src/resolvers.c