Unable to obtain ACME Certificate cloudflare inside traefik

Hi, I have a very weird issue. I am able to obtain the acme certificate on my web server but unable to inside traefik. Here is the output from the webserver using the lego command

sudo CLOUDFLARE_DNS_API_TOKEN=***** lego --email *****@gmail.com --dns cloudflare --server "
https://acme-staging-v02.api.letsencrypt.org/directory" -d '*.takhi.co' -d takhi.co run

2025/02/06 05:46:14 [INFO] [*.takhi.co, takhi.co] acme: Obtaining bundled SAN certificate
2025/02/06 05:46:14 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/new-order
2025/02/06 05:46:14 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149384
2025/02/06 05:46:14 [DEBUG] HEAD https://acme-staging-v02.api.letsencrypt.org/acme/new-nonce
2025/02/06 05:46:15 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149394
2025/02/06 05:46:15 [INFO] [*.takhi.co] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149384
2025/02/06 05:46:15 [INFO] [takhi.co] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149394
2025/02/06 05:46:15 [INFO] [*.takhi.co] acme: use dns-01 solver
2025/02/06 05:46:15 [INFO] [takhi.co] acme: Could not find solver for: tls-alpn-01
2025/02/06 05:46:15 [INFO] [takhi.co] acme: Could not find solver for: http-01
2025/02/06 05:46:15 [INFO] [takhi.co] acme: use dns-01 solver
2025/02/06 05:46:15 [INFO] [*.takhi.co] acme: Preparing to solve DNS-01
2025/02/06 05:46:17 [INFO] cloudflare: new record for takhi.co, ID 8d1076df6a11f99bb7b988a2b2e7d147
2025/02/06 05:46:17 [INFO] [takhi.co] acme: Preparing to solve DNS-01
2025/02/06 05:46:17 [INFO] cloudflare: new record for takhi.co, ID c78b4f7afd1997e9365b2ce208337fa3
2025/02/06 05:46:17 [INFO] [*.takhi.co] acme: Trying to solve DNS-01
2025/02/06 05:46:17 [INFO] [*.takhi.co] acme: Checking DNS record propagation. [nameservers=127.0.0.53:53]
2025/02/06 05:46:19 [INFO] Wait for propagation [timeout: 2m0s, interval: 2s]
2025/02/06 05:46:19 [INFO] [*.takhi.co] acme: Waiting for DNS record propagation.
2025/02/06 05:46:21 [INFO] [*.takhi.co] acme: Waiting for DNS record propagation.
2025/02/06 05:46:23 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/chall/183626494/15964149384/fRaMKw
2025/02/06 05:46:24 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149384
2025/02/06 05:46:28 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149384
2025/02/06 05:46:28 [INFO] [*.takhi.co] The server validated our request
2025/02/06 05:46:28 [INFO] [takhi.co] acme: Trying to solve DNS-01
2025/02/06 05:46:28 [INFO] [takhi.co] acme: Checking DNS record propagation. [nameservers=127.0.0.53:53]
2025/02/06 05:46:30 [INFO] Wait for propagation [timeout: 2m0s, interval: 2s]
2025/02/06 05:46:30 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/chall/183626494/15964149394/d9qYBQ
2025/02/06 05:46:30 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149394
2025/02/06 05:46:35 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626494/15964149394
2025/02/06 05:46:35 [INFO] [takhi.co] The server validated our request
2025/02/06 05:46:35 [INFO] [*.takhi.co] acme: Cleaning DNS-01 challenge
2025/02/06 05:46:36 [INFO] [takhi.co] acme: Cleaning DNS-01 challenge
2025/02/06 05:46:37 [INFO] [*.takhi.co, takhi.co] acme: Validations succeeded; requesting certificates
2025/02/06 05:46:37 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/finalize/183626494/22436420994
2025/02/06 05:46:37 [INFO] Wait for certificate [timeout: 30s, interval: 500ms]
2025/02/06 05:46:37 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/order/183626494/22436420994
2025/02/06 05:46:38 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/order/183626494/22436420994
2025/02/06 05:46:38 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/order/183626494/22436420994
2025/02/06 05:46:39 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/order/183626494/22436420994
2025/02/06 05:46:39 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/cert/2b1ef77ab6569470af38a204fb47095df46c
2025/02/06 05:46:39 [DEBUG] POST https://acme-staging-v02.api.letsencrypt.org/acme/cert/2b1ef77ab6569470af38a204fb47095df46c/1
2025/02/06 05:46:40 [INFO] [*.takhi.co] Server responded with a certificate.

I'm using the same token inside traefik and i get this logs. It seems like it was able to read the zone but unable to modify the dns txt record

2025-02-06T05:49:44Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:940 > Looking for provided certificate(s) to validate ["takhi.co" "*.takhi.co"]... ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory providerName=cloudflare.acme
2025-02-06T05:49:44Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:986 > Domains need ACME certificates generation for domains "takhi.co,*.takhi.co". ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory domains=["takhi.co","*.takhi.co"] providerName=cloudflare.acme
2025-02-06T05:49:44Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:706 > Loading ACME certificates [takhi.co *.takhi.co]... ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory providerName=cloudflare.acme
2025-02-06T05:49:47Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:270 > Building ACME client... providerName=cloudflare.acme
2025-02-06T05:49:47Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:276 > https://acme-staging-v02.api.letsencrypt.org/directory providerName=cloudflare.acme
2025-02-06T05:49:47Z INF github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:457 > Register... providerName=cloudflare.acme
2025-02-06T05:49:47Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] acme: Registering account for *****@gmail.com lib=lego
2025-02-06T05:49:48Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:317 > Using DNS Challenge provider: cloudflare providerName=cloudflare.acme
2025-02-06T05:49:48Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co, *.takhi.co] acme: Obtaining bundled SAN certificate lib=lego
2025-02-06T05:49:49Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15964170864 lib=lego
2025-02-06T05:49:49Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15964170874 lib=lego
2025-02-06T05:49:49Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: use dns-01 solver lib=lego
2025-02-06T05:49:49Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: Could not find solver for: tls-alpn-01 lib=lego
2025-02-06T05:49:49Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: Could not find solver for: http-01 lib=lego
2025-02-06T05:49:49Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: use dns-01 solver lib=lego
2025-02-06T05:49:49Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Preparing to solve DNS-01 lib=lego
2025-02-06T05:49:51Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] cloudflare: new record for takhi.co, ID 21a24776280cac9ca746b718a594eaa2 lib=lego
2025-02-06T05:49:51Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: Preparing to solve DNS-01 lib=lego
2025-02-06T05:49:51Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] cloudflare: new record for takhi.co, ID 50a1910ed505717a40a2d07e3afc980f lib=lego
2025-02-06T05:49:51Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Trying to solve DNS-01 lib=lego
2025-02-06T05:49:51Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Checking DNS record propagation. [nameservers=1.1.1.1:53,1.0.0.1:53] lib=lego
2025-02-06T05:49:53Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Wait for propagation [timeout: 2m0s, interval: 2s] lib=lego
2025-02-06T05:49:54Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: Trying to solve DNS-01 lib=lego
2025-02-06T05:49:54Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: Checking DNS record propagation. [nameservers=1.1.1.1:53,1.0.0.1:53] lib=lego
2025-02-06T05:49:56Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Wait for propagation [timeout: 2m0s, interval: 2s] lib=lego
2025-02-06T05:49:56Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Cleaning DNS-01 challenge lib=lego
2025-02-06T05:49:57Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: Cleaning DNS-01 challenge lib=lego
2025-02-06T05:49:58Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Deactivating auth: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15964170864 lib=lego
2025-02-06T05:49:58Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Deactivating auth: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15964170874 lib=lego
2025-02-06T05:49:59Z ERR github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:553 > Unable to obtain ACME certificate for domains error="unable to generate a certificate for the domains [takhi.co *.takhi.co]: error: one or more domains had a problem:\n[*.takhi.co] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: No TXT record found at _acme-challenge.takhi.co\n[takhi.co] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: No TXT record found at _acme-challenge.takhi.co\n" ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory domains=["takhi.co","*.takhi.co"] providerName=cloudflare.acme routerName=traefik-secure@docker rule=Host(`traefik.takhi.co`)

How do you run Traefik? You are sure the env var is provided correctly?

I'm pretty sure because I once tried entering the wrong api key and i got a different error "unable to retrieve zone"

I'm using the same config as this, using a secrets file in docker and passing it as CF_DNS_API_TOKEN_FILE in the compose file. traefik.yaml file is the same as well

this is the logs when i input a wrong api key.

2025-02-07T05:56:20Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: authorization already valid; skipping challenge lib=lego
2025-02-07T05:56:20Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: use dns-01 solver lib=lego
2025-02-07T05:56:20Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Preparing to solve DNS-01 lib=lego
2025-02-07T05:56:21Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Cleaning DNS-01 challenge lib=lego
2025-02-07T05:56:22Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [WARN] [*.takhi.co] acme: cleaning up failed: cloudflare: failed to find zone takhi.co.: ListZonesContext command failed: Invalid access token (9109)  lib=lego
2025-02-07T05:56:22Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Skipping deactivating of valid auth: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15964201114 lib=lego
2025-02-07T05:56:22Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Deactivating auth: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15976874184 lib=lego
2025-02-07T05:56:23Z ERR github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:553 > Unable to obtain ACME certificate for domains error="unable to generate a certificate for the domains [takhi.co *.takhi.co]: error: one or more domains had a problem:\n[*.takhi.co] [*.takhi.co] acme: error presenting token: cloudflare: failed to find zone takhi.co.: ListZonesContext command failed: Invalid access token (9109)\n" ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory domains=["takhi.co","*.takhi.co"] providerName=cloudflare.acme routerName=traefik-secure@docker rule=Host(`traefik.takhi.co`)
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/server/router/tcp/manager.go:237 > Adding route for traefik.takhi.co with TLS options default entryPointName=https
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/server/router/tcp/manager.go:237 > Adding route for portainer.takhi.co with TLS options default entryPointName=https
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:940 > Looking for provided certificate(s) to validate ["takhi.co" "*.takhi.co"]... ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory providerName=cloudflare.acme
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:986 > Domains need ACME certificates generation for domains "takhi.co,*.takhi.co". ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory domains=["takhi.co","*.takhi.co"] providerName=cloudflare.acme
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:706 > Loading ACME certificates [takhi.co *.takhi.co]... ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory providerName=cloudflare.acme
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:270 > Building ACME client... providerName=cloudflare.acme
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:276 > https://acme-staging-v02.api.letsencrypt.org/directory providerName=cloudflare.acme
2025-02-11T07:34:05Z DBG github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:317 > Using DNS Challenge provider: cloudflare providerName=cloudflare.acme
2025-02-11T07:34:05Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co, *.takhi.co] acme: Obtaining bundled SAN certificate lib=lego
2025-02-11T07:34:07Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15964201114 lib=lego
2025-02-11T07:34:07Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] AuthURL: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/16024779214 lib=lego
2025-02-11T07:34:07Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [takhi.co] acme: authorization already valid; skipping challenge lib=lego
2025-02-11T07:34:07Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: use dns-01 solver lib=lego
2025-02-11T07:34:07Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Preparing to solve DNS-01 lib=lego
2025-02-11T07:34:09Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] cloudflare: new record for takhi.co, ID 1dcb2788cc2b8a3c34d82cc93142db28 lib=lego
2025-02-11T07:34:09Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Trying to solve DNS-01 lib=lego
2025-02-11T07:34:09Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Checking DNS record propagation. [nameservers=1.1.1.1:53,1.0.0.1:53] lib=lego
2025-02-11T07:34:11Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Wait for propagation [timeout: 2m0s, interval: 2s] lib=lego
2025-02-11T07:34:11Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] [*.takhi.co] acme: Cleaning DNS-01 challenge lib=lego
2025-02-11T07:34:12Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Skipping deactivating of valid auth: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/15964201114 lib=lego
2025-02-11T07:34:12Z DBG github.com/go-acme/lego/v4@v4.21.0/log/logger.go:48 > [INFO] Deactivating auth: https://acme-staging-v02.api.letsencrypt.org/acme/authz/183626874/16024779214 lib=lego
2025-02-11T07:34:12Z ERR github.com/traefik/traefik/v3/pkg/provider/acme/provider.go:553 > Unable to obtain ACME certificate for domains error="unable to generate a certificate for the domains [takhi.co *.takhi.co]: error: one or more domains had a problem:\n[*.takhi.co] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized :: No TXT record found at _acme-challenge.takhi.co\n" ACME CA=https://acme-staging-v02.api.letsencrypt.org/directory acmeCA=https://acme-staging-v02.api.letsencrypt.org/directory domains=["takhi.co","*.takhi.co"] providerName=cloudflare.acme routerName=traefik-secure@docker rule=Host(`traefik.takhi.co`)

It says here new record for takhi.co, which I assume it created a new TXT record on cloudflare successfully, but after that the error message says no TXT record found. It seems like it's creating the record and deleting it? I can't see the dns record logs in cloudflare

This is what should be happening:

  1. Traefik go-acme creates TXT record
  2. Traefik go-acme triggers LetsEncrypt to verify the TXT record externally
  3. Traefik go-acme removes TXT record

So you only have a short period of time while the TXT record should be visible.

You can set delayBeforeCheck to make it wait for a (longer) period of time (doc).

You can also try to set env variable LEGO_DISABLE_CNAME_SUPPORT=true (doc).

certificatesResolvers:
  cloudflare:
    acme:
      #caServer: https://acme-v02.api.letsencrypt.org/directory # production (default)
      caServer: https://acme-staging-v02.api.letsencrypt.org/directory # staging (testing)
      email: **** # Cloudflare email (or other provider)
      storage: ./acme.json
      dnsChallenge:
        provider: cloudflare
        disablePropagationCheck: false
        resolvers:
          - 1.1.1.1:53
          - 1.0.0.1:53

the fix was to set disablePropagationCheck to false!

That's interesting, so Traefik itself could not validate the TXT record, but external LetsEncrypt can. Thanks for sharing.