1. The problem I’m having:
I have tried both Linode add-ons for Caddy and with both I am receiving errors when I try to utilize DNS validation for Let’s Encrypt certificates. I must be doing something wrong, but I can’t figure it out. If anyone has used Linode for DNS validation with Caddy/Let’s Encrypt, please help!
2. Error messages and/or full log output:
My systemctl logs look like this:
May 06 20:24:20 morpheus caddy[2556205]: {"level":"info","ts":1715027060.766635,"logger":"tls.obtain","msg":"obtaining certificate","identifier":"test2.beersmas.com"}
May 06 20:24:20 morpheus caddy[2556205]: {"level":"info","ts":1715027060.7674685,"logger":"tls.issuance.acme","msg":"waiting on internal rate limiter","identifiers":["test2.beersmas.com"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}
May 06 20:24:20 morpheus caddy[2556205]: {"level":"info","ts":1715027060.767484,"logger":"tls.issuance.acme","msg":"done waiting on internal rate limiter","identifiers":["test2.beersmas.com"],"ca":"https://acme-v02.api.letsencrypt.org/directory","account":""}
May 06 20:24:21 morpheus caddy[2556205]: {"level":"info","ts":1715027061.0487003,"logger":"tls.issuance.acme.acme_client","msg":"trying to solve challenge","identifier":"test2.beersmas.com","challenge_type":"dns-01","ca":"https://acme-v02.api.letsencrypt.org/directory"}
May 06 20:24:21 morpheus caddy[2556205]: {"level":"error","ts":1715027061.3639472,"logger":"tls.issuance.acme.acme_client","msg":"cleaning up solver","identifier":"test2.beersmas.com","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.test2.beersmas.com\" (usually OK if presenting also failed)"}
May 06 20:24:21 morpheus caddy[2556205]: {"level":"error","ts":1715027061.3862052,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"test2.beersmas.com","issuer":"acme-v02.api.letsencrypt.org-directory","error":"[test2.beersmas.com] solving challenges: presenting for challenge: adding temporary record for zone \"beersmas.com.\": could not find domain ID for zone: beersmas.com.: could not list domains: [401] Invalid Token (order=https://acme-v02.api.letsencrypt.org/acme/order/1712058617/267163312347) (ca=https://acme-v02.api.letsencrypt.org/directory)"}
May 06 20:24:21 morpheus caddy[2556205]: {"level":"info","ts":1715027061.3869252,"logger":"tls.issuance.zerossl","msg":"waiting on internal rate limiter","identifiers":["test2.beersmas.com"],"ca":"https://acme.zerossl.com/v2/DV90","account":"caddy@zerossl.com"}
May 06 20:24:21 morpheus caddy[2556205]: {"level":"info","ts":1715027061.3869581,"logger":"tls.issuance.zerossl","msg":"done waiting on internal rate limiter","identifiers":["test2.beersmas.com"],"ca":"https://acme.zerossl.com/v2/DV90","account":"caddy@zerossl.com"}
May 06 20:24:22 morpheus caddy[2556205]: {"level":"info","ts":1715027062.0235941,"logger":"tls.issuance.zerossl.acme_client","msg":"trying to solve challenge","identifier":"test2.beersmas.com","challenge_type":"dns-01","ca":"https://acme.zerossl.com/v2/DV90"}
May 06 20:24:22 morpheus caddy[2556205]: {"level":"error","ts":1715027062.0909102,"logger":"tls.issuance.zerossl.acme_client","msg":"cleaning up solver","identifier":"test2.beersmas.com","challenge_type":"dns-01","error":"no memory of presenting a DNS record for \"_acme-challenge.test2.beersmas.com\" (usually OK if presenting also failed)"}
May 06 20:24:22 morpheus caddy[2556205]: {"level":"error","ts":1715027062.190231,"logger":"tls.obtain","msg":"could not get certificate from issuer","identifier":"test2.beersmas.com","issuer":"acme.zerossl.com-v2-DV90","error":"[test2.beersmas.com] solving challenges: presenting for challenge: adding temporary record for zone \"beersmas.com.\": could not find domain ID for zone: beersmas.com.: could not list domains: [401] Invalid Token (order=https://acme.zerossl.com/v2/DV90/order/BX6cBdA_0ieJaqy0G5EYdQ) (ca=https://acme.zerossl.com/v2/DV90)"}
May 06 20:24:22 morpheus caddy[2556205]: {"level":"error","ts":1715027062.1903296,"logger":"tls.obtain","msg":"will retry","error":"[test2.beersmas.com] Obtain: [test2.beersmas.com] solving challenges: presenting for challenge: adding temporary record for zone \"beersmas.com.\": could not find domain ID for zone: beersmas.com.: could not list domains: [401] Invalid Token (order=https://acme.zerossl.com/v2/DV90/order/BX6cBdA_0ieJaqy0G5EYdQ) (ca=https://acme.zerossl.com/v2/DV90)","attempt":1,"retrying_in":60,"elapsed":1.423860267,"max_duration":2592000}
And if I chase the URLs in the log lines I see the following:
{
"status": "invalid",
"expires": "2024-05-13T20:24:20Z",
"identifiers": [
{
"type": "dns",
"value": "test2.beersmas.com"
}
],
"authorizations": [
"https://acme-v02.api.letsencrypt.org/acme/authz-v3/347513587217"
],
"finalize": "https://acme-v02.api.letsencrypt.org/acme/finalize/1712058617/267163312347"
}
And this:
{"type":"urn:ietf:params:acme:error:malformed","status":405,"detail":"The request message was malformed"}
And “Authorizations” request from the first link:
{
"identifier": {
"type": "dns",
"value": "test2.beersmas.com"
},
"status": "deactivated",
"expires": "2024-05-13T20:24:20Z",
"challenges": [
{
"type": "http-01",
"status": "pending",
"url": "https://acme-v02.api.letsencrypt.org/acme/chall-v3/347513587217/DG2c7A",
"token": "CNvD2mmgkUCjFhZitF5rilKp4ZO87LFfsPXa_ACvziI"
},
{
"type": "dns-01",
"status": "pending",
"url": "https://acme-v02.api.letsencrypt.org/acme/chall-v3/347513587217/GpboQQ",
"token": "CNvD2mmgkUCjFhZitF5rilKp4ZO87LFfsPXa_ACvziI"
},
{
"type": "tls-alpn-01",
"status": "pending",
"url": "https://acme-v02.api.letsencrypt.org/acme/chall-v3/347513587217/M032xg",
"token": "CNvD2mmgkUCjFhZitF5rilKp4ZO87LFfsPXa_ACvziI"
}
]
}
And “finalize” link from the first link:
{
"type": "urn:ietf:params:acme:error:malformed",
"detail": "Method not allowed",
"status": 405
}
3. Caddy version:
v2.7.6 h1:w0NymbG2m9PcvKWsrXO6EEkY9Ru4FJK8uQbYcev1p3A=
4. How I installed and ran Caddy:
I downloaded a binary from the website. Specifically, I selected the base options + the dns.providers.linode add-on (I have tried BOTH the tosie/caddy-dns-linode add-on and the caddy-dns/linode add on and both with the same results.
I then installed that in /usr/local/bin/caddy and ran caddy as a systemctl service.
a. System environment:
My system is running Ubuntu 20.04 (Ubuntu 22.04.4 LTS). Caddy is NOT running in docker it is standalone as described above.
b. Command:
sudo systemctl enable --now caddy
c. Service/unit/compose file:
Not relevant.
d. My complete Caddy config:
{
acme_dns linode {"REMOVED TOKEN"}
}
(trusted_proxy_list) {
trusted_proxies 10.0.1.0/24
}
## Unprotected Endpoints (no forced auth)
ha.beersmas.com {
reverse_proxy 10.0.1.30:8123 {
import trusted_proxy_list
}
}
nas.beersmas.com {
reverse_proxy 10.0.1.20:5000 {
import trusted_proxy_list
}
}
auth.beersmas.com {
reverse_proxy 10.0.1.40:9091 {
import trusted_proxy_list
}
}
## Protected Endpoints (force auth)
radarr.beersmas.com {
forward_auth 10.0.1.40:9091 {
uri /api/verify?rd=https://auth.beersmas.com:8001
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
import trusted_proxy_list
}
reverse_proxy 10.0.1.40:7878 {
import trusted_proxy_list
}
}
lidarr.beersmas.com {
forward_auth 10.0.1.40:9091 {
uri /api/verify?rd=https://auth.beersmas.com:8001
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
import trusted_proxy_list
}
reverse_proxy 10.0.1.40:8686 {
import trusted_proxy_list
}
}
sonarr.beersmas.com {
forward_auth 10.0.1.40:9091 {
uri /api/verify?rd=https://auth.beersmas.com:8001
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
import trusted_proxy_list
}
reverse_proxy 10.0.1.40:8989 {
import trusted_proxy_list
}
}
sabnzbd.beersmas.com {
forward_auth 10.0.1.40:9091 {
uri /api/verify?rd=https://auth.beersmas.com:8001
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
import trusted_proxy_list
}
reverse_proxy 10.0.1.40:8080 {
import trusted_proxy_list
}
}
ombi.beersmas.com {
forward_auth 10.0.1.40:9091 {
uri /api/verify?rd=https://auth.beersmas.com:8001
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
import trusted_proxy_list
}
reverse_proxy 10.0.1.40:3579 {
import trusted_proxy_list
}
}
vs.beersmas.com {
forward_auth 10.0.1.40:9091 {
uri /api/verify?rd=https://auth.beersmas.com:8001
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
import trusted_proxy_list
}
reverse_proxy 10.0.1.40:8443 {
import trusted_proxy_list
}
}
test2.beersmas.com {
forward_auth 10.0.1.40:9091 {
uri /api/verify?rd=https://auth.beersmas.com:8001
copy_headers Remote-User Remote-Groups Remote-Email Remote-Name
import trusted_proxy_list
}
reverse_proxy 10.0.1.40:8443 {
import trusted_proxy_list
}
}