Wildcard and Namecheap Issues?

1. The problem I’m having:

Hello everyone. :slight_smile: I am trying to use Namecheap as my DNS Provider and have Caddy lease and renew certificates for my wildcard url. I get an error saying xyz is not a valid domain. I am not sure where to begin troubleshooting. I can confirm my namecheap DNS has a wildcard with the appropiate IP Address.

2. Error messages and/or full log output:

caddy  | {"level":"error","ts":1701060103.9745886,"logger":"tls.issuance.zerossl.acme_client","msg":"cleaning up solver","identifier":"*.example.com","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.example.com\" (usually OK if presenting also failed)"}
caddy  | {"level":"error","ts":1701060104.0441127,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"*.example.com","issuer":"acme-staging-v02.api.letsencrypt.org-directory","error":"[*.example.com] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": domain: xyz is not a valid domain. Expected at least 1 TLD and 1 SLD (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12565262814) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
caddy  | {"level":"error","ts":1701060104.0441592,"logger":"tls.obtain","msg":"will retry","error":"[*.example.com] Obtain: [*.example.com] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": domain: xyz is not a valid domain. Expected at least 1 TLD and 1 SLD (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12565262814) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)","attempt":3,"retrying_in":120,"elapsed":182.406113883,"max_duration":2592000}
caddy  | {"level":"info","ts":1701060224.0448413,"logger":"tls.obtain","msg":"obtaining certificate","identifier":"*.example.com"}
caddy  | {"level":"info","ts":1701060224.25706,"logger":"tls.issuance.acme.acme_client","msg":"trying to solve challenge","identifier":"*.example.com","challenge_type":"dns-01","ca":"https://acme-staging-v02.api.letsencrypt.org/directory"}
caddy  | {"level":"error","ts":1701060224.3363547,"logger":"tls.issuance.acme.acme_client","msg":"cleaning up solver","identifier":"*.example.com","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.example.com\" (usually OK if presenting also failed)"}
caddy  | {"level":"error","ts":1701060224.405523,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"*.example.com","issuer":"acme-staging-v02.api.letsencrypt.org-directory","error":"[*.example.com] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": domain: xyz is not a valid domain. Expected at least 1 TLD and 1 SLD (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12565306424) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
caddy  | {"level":"info","ts":1701060224.61004,"logger":"tls.issuance.zerossl.acme_client","msg":"trying to solve challenge","identifier":"*.example.com","challenge_type":"dns-01","ca":"https://acme-staging-v02.api.letsencrypt.org/directory"}
caddy  | {"level":"error","ts":1701060224.639476,"logger":"tls.issuance.zerossl.acme_client","msg":"cleaning up solver","identifier":"*.example.com","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.example.com\" (usually OK if presenting also failed)"}
caddy  | {"level":"error","ts":1701060224.7054188,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"*.example.com","issuer":"acme-staging-v02.api.letsencrypt.org-directory","error":"[*.example.com] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": domain: xyz is not a valid domain. Expected at least 1 TLD and 1 SLD (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12565306614) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
caddy  | {"level":"error","ts":1701060224.7054589,"logger":"tls.obtain","msg":"will retry","error":"[*.example.com] Obtain: [*.example.com] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": domain: xyz is not a valid domain. Expected at least 1 TLD and 1 SLD (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12565306614) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)","attempt":4,"retrying_in":300,"elapsed":303.067413508,"max_duration":2592000}
^CGracefully stopping... (press Ctrl+C again to force)

3. Caddy version:

# caddy version
v2.7.5 h1:HoysvZkLcN2xJExEepaFHK92Qgs7xAiCFydN5x5Hs6Q=

4. How I installed and ran Caddy:

Built a caddy container using docker and docker compose.

Here is the Dockerfile:

FROM caddy:builder AS builder

RUN xcaddy build \
    --with github.com/caddy-dns/namecheap 

FROM caddy:latest

RUN apk add --no-cache bash
RUN apk add --no-cache vim

COPY --from=builder /usr/bin/caddy /usr/bin/caddy

c. Service/unit/compose file:

version: "3.7"

services:
  caddy:
    image: caddy:latest
    container_name: caddy
    restart: unless-stopped
    build:
      context: ./build
      dockerfile: dockerfile
    cap_add:
      - NET_ADMIN
    ports:
      - "80:80"
      - "443:443"
      - "443:443/udp"
    volumes:
      - $PWD/Caddyfile:/etc/caddy/Caddyfile 
      - $PWD/site:/srv
      - $PWD/data:/data
      - $PWD/config:/config
  
  portainer:
    image: portainer/portainer-ce:alpine
    container_name: portainer
    command: -H unix:///var/run/docker.sock
    ports:
      - "9000:9000"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
      - "portainer_data:/data"
    restart: always

volumes:
  portainer_data:

d. My complete Caddy config:

{
	acme_ca https://acme-staging-v02.api.letsencrypt.org/directory
}

(tls_config) {
	tls {
		dns namecheap {
			api_key {env.NAMECHEAP_API_KEY}
			user {env.NAMECHEAP_API_USER}
		}
	}
}

*.4tress.xyz {
	import tls_config
	header Access-Control-Allow-Origin "*"
	header Access-Control-Allow-Methods "POST, GET, OPTIONS"

	@books host books.4tress.xyz
	handle @books {
		reverse_proxy 192.168.50.77:8083
	}
	@docker host docker.4tress.xyz
	handle @docker {
		reverse_proxy 192.168.50.77:9000
	}
	@home host home.4tress.xyz
	handle @home {
		reverse_proxy 192.168.50.77:3015
	}
	@sync host syncthing.4tress.xyz
	handle @sync {
		reverse_proxy 192.168.50.77:8084
	}
}

I see that this is the same issue as this user was having:

I think there’s probably a bug with the libdns/namecheap plugin.

The error is coming from here:

Please open an issue on GitHub to get help with this.

I went ahead and made an issue here. I will keep this thread updated when there is progress. Thank you!

I see to be getting a similar response about my domain from Google Cloud DNS and ROUTE 53. I am using the staging server as per my caddy config - am I still rate limited?

caddy  | {"level":"info","ts":1701182952.121528,"logger":"tls.issuance.acme","msg":"waiting on internal rate limiter","identifiers":["*.4tress.xyz"],"ca":"https://acme-staging-v02.api.letsencrypt.org/directory","account":""}
caddy  | {"level":"info","ts":1701182952.1226685,"logger":"tls.issuance.acme","msg":"done waiting on internal rate limiter","identifiers":["*.4tress.xyz"],"ca":"https://acme-staging-v02.api.letsencrypt.org/directory","account":""}
caddy  | {"level":"info","ts":1701182952.6054409,"logger":"tls.issuance.acme.acme_client","msg":"trying to solve challenge","identifier":"*.4tress.xyz","challenge_type":"dns-01","ca":"https://acme-staging-v02.api.letsencrypt.org/directory"}
caddy  | {"level":"error","ts":1701182953.0826576,"logger":"tls.issuance.acme.acme_client","msg":"cleaning up solver","identifier":"*.4tress.xyz","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.4tress.xyz\" (usually OK if presenting also failed)"}
caddy  | {"level":"error","ts":1701182953.1508667,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"*.4tress.xyz","issuer":"acme-staging-v02.api.letsencrypt.org-directory","error":"[*.4tress.xyz] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": HostedZoneNotFound: No zones found for the domain xyz. (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12601994404) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
caddy  | {"level":"info","ts":1701182953.1513336,"logger":"tls.issuance.zerossl","msg":"waiting on internal rate limiter","identifiers":["*.4tress.xyz"],"ca":"https://acme-staging-v02.api.letsencrypt.org/directory","account":""}
caddy  | {"level":"info","ts":1701182953.151364,"logger":"tls.issuance.zerossl","msg":"done waiting on internal rate limiter","identifiers":["*.4tress.xyz"],"ca":"https://acme-staging-v02.api.letsencrypt.org/directory","account":""}
caddy  | {"level":"info","ts":1701182953.4686947,"logger":"tls.issuance.zerossl.acme_client","msg":"trying to solve challenge","identifier":"*.4tress.xyz","challenge_type":"dns-01","ca":"https://acme-staging-v02.api.letsencrypt.org/directory"}
caddy  | {"level":"error","ts":1701182953.8321927,"logger":"tls.issuance.zerossl.acme_client","msg":"cleaning up solver","identifier":"*.4tress.xyz","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.4tress.xyz\" (usually OK if presenting also failed)"}
caddy  | {"level":"error","ts":1701182953.8971004,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"*.4tress.xyz","issuer":"acme-staging-v02.api.letsencrypt.org-directory","error":"[*.4tress.xyz] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": HostedZoneNotFound: No zones found for the domain xyz. (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12601994714) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
caddy  | {"level":"error","ts":1701182953.897135,"logger":"tls.obtain","msg":"will retry","error":"[*.4tress.xyz] Obtain: [*.4tress.xyz] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": HostedZoneNotFound: No zones found for the domain xyz. (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/126400904/12601994714) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)","attempt":1,"retrying_in":60,"elapsed":1.777748503,"max_duration":2592000}

That error is coming from here:

I have to conclude there’s something weird about your domain that’s causing this.

I’m not sure why the zone is xyz., it should be 4tress.xyz. I think. :thinking:

I noticed the same thing! I am so lost right now. Everything was working fine in my testing, I’m not sure what I changed to break things so suddenly, and I don’t know how my domain is the issue. I can only hope the issue on GitHub updates, but the fact that it reoccurs across different DNS plugins doesn’t reassure me.

When I tried my domain without a wildcard and without any DNS plugins, I got this:

caddy  | {"level":"error","ts":1701221723.7379491,"logger":"tls.obtain","msg":"will retry","error":"[4tress.xyz] Obtain: [4tress.xyz] solving challenge: 4tress.xyz: [4tress.xyz] authorization failed: HTTP 400 urn:ietf:params:acme:error:tls - 68.13.176.197: remote error: tls: no application protocol (ca=https://acme-staging-v02.api.letsencrypt.org/directory)","attempt":1,"retrying_in":60,"elapsed":2.847745805,"max_duration":2592000}

Is the zone missing a SOA record? Or an NS record?

Sorry for being dense, but can you elaborate?

Does the domain name have proper DNS records? Specifically NS / SOA record types?

Yes, I went ahead and checked it again. NS and SOA in particular is correct.
For clarity: I am currently using Google Cloud as my DNS provider since namecheap wasn’t giving me results.

{"level":"error","ts":1701492886.637473,"logger":"tls.issuance.acme.acme_client","msg":"cleaning up solver","identifier":"*.4tress.xyz","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.4tress.xyz\" (usually OK if presenting also failed)"}
{"level":"error","ts":1701492886.7012322,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"*.4tress.xyz","issuer":"acme-staging-v02.api.letsencrypt.org-directory","error":"[*.4tress.xyz] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": unable to find Google managaged zone for domain xyz. (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/127499404/12687875944) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
{"level":"info","ts":1701492886.902997,"logger":"tls.issuance.zerossl.acme_client","msg":"trying to solve challenge","identifier":"*.4tress.xyz","challenge_type":"dns-01","ca":"https://acme-staging-v02.api.letsencrypt.org/directory"}
{"level":"error","ts":1701492886.9030626,"logger":"tls.issuance.zerossl.acme_client","msg":"cleaning up solver","identifier":"*.4tress.xyz","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.4tress.xyz\" (usually OK if presenting also failed)"}
{"level":"error","ts":1701492886.9718497,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"*.4tress.xyz","issuer":"acme-staging-v02.api.letsencrypt.org-directory","error":"[*.4tress.xyz] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": unable to find Google managaged zone for domain xyz. (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/127499404/12687876034) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)"}
{"level":"error","ts":1701492886.97218,"logger":"tls.obtain","msg":"will retry","error":"[*.4tress.xyz] Obtain: [*.4tress.xyz] solving challenges: presenting for challenge: adding temporary record for zone \"xyz.\": unable to find Google managaged zone for domain xyz. (order=https://acme-staging-v02.api.letsencrypt.org/acme/order/127499404/12687876034) (ca=https://acme-staging-v02.api.letsencrypt.org/directory)","attempt":2,"retrying_in":120,"elapsed":61.960046321,"max_duration":2592000}

Hmm, that leads me to believe something strange about the Google Cloud environment. Does it have split DNS or something?

It has “zones” so it could, yes, but I only have one at the moment. The same issue is occurring so I don’t think rate limiting is a problem anymore. I seem to run into an issue regardless of what DNS plugin I am using. I have no problems using DNS plugins in other tools, such as NGINX Proxy Manager, or certbot. Truly don’t know the issue.