What happened
Deploy test (CFN create + destroy) failed on master run
34545745840
(head 2e485a1, merge of #650 — the ttyd per-user-unix-socket change).
deploy-test (ipv4-full, true, false) failed at "Smoke test — wait for
authenticated terminal URL to serve ttyd HTML": curl got
OpenSSL/3.0.13: error:0A000438:SSL routines::tlsv1 alert internal error
for the full 10-minute window — same client-side symptom as #510/#511, but a
different, new server-side cause.
This is not a regression from #650. #650 only touches the ttyd backend
(unix socket instead of a loopback port) and the Caddyfile's terminal
reverse_proxy target; it never touches caddyfile-header.caddy, the ACME
issuer acme block, or anything DNS/networking-related. The ipv6-outputs
leg of the same run passed. The 10 master Deploy test runs before this one
were all green.
Root cause (from the SSM journalctl -u caddy dump)
Caddy's certmagic issues a staging "canary" cert first (built-in
certmagic behavior, same mechanism as #510/#511) to confirm domain control
cheaply before spending a production attempt. This time the canary itself
never succeeded — every attempt (5 over the 10-minute window, backoff
120s/120s/300s/300s) failed the same way, entirely on Let's Encrypt's side:
{"level":"error","logger":"http.acme_client","msg":"challenge failed",
"identifier":"32-185-166-161.sslip.io","challenge_type":"tls-alpn-01",
"problem":{"type":"urn:ietf:params:acme:error:dns","title":"",
"detail":"During secondary validation: DNS problem: networking error
looking up A for 32-185-166-161.sslip.io; DNS problem: networking error
looking up AAAA for 32-185-166-161.sslip.io"}}
Let's Encrypt's multi-perspective ("secondary validation") checks could not
resolve the box's own sslip.io hostname at all, from LE's own validation
vantage points — a DNS lookup failure on LE's side against a wildcard DNS
service, not anything Caddy, the box, or #650 did. Because the canary never
clears, the flow never reaches the production issuer, so Caddy has no cert
to serve for the whole window and every client TLS handshake gets an
internal-error alert.
This is a different signature from #510/#511 (which got past the canary and
into production issuance, then hit a chain-download 404). Filing this as a
new occurrence in the same deploy-test-flake family (see also #186, #190,
#373) rather than reopening #510/#511, since the failing stage and the
upstream error are both different.
Why file rather than fix
Same trade-off #511 already laid out, and it still applies:
- Do nothing — first failure of this shape, self-resolves on Let's Encrypt's
or sslip.io's side, re-running (or the next push's own deploy-test) would
very likely go green.
- Extend the smoke test's patience / add a mid-run retry.
- Configure a second issuer (e.g. ZeroSSL) as a certmagic fallback so a
transient LE validation hiccup doesn't stall the whole box.
Filing so evidence accumulates here if this DNS-validation shape recurs,
rather than each occurrence re-deriving the diagnosis from scratch.
Repro / evidence
What happened
Deploy test (CFN create + destroy)failed on master run34545745840
(head
2e485a1, merge of #650 — the ttyd per-user-unix-socket change).deploy-test (ipv4-full, true, false)failed at "Smoke test — wait forauthenticated terminal URL to serve ttyd HTML":
curlgotOpenSSL/3.0.13: error:0A000438:SSL routines::tlsv1 alert internal errorfor the full 10-minute window — same client-side symptom as #510/#511, but a
different, new server-side cause.
This is not a regression from #650. #650 only touches the ttyd backend
(unix socket instead of a loopback port) and the Caddyfile's terminal
reverse_proxytarget; it never touchescaddyfile-header.caddy, the ACMEissuer acmeblock, or anything DNS/networking-related. Theipv6-outputsleg of the same run passed. The 10 master
Deploy testruns before this onewere all green.
Root cause (from the SSM
journalctl -u caddydump)Caddy's certmagic issues a staging "canary" cert first (built-in
certmagic behavior, same mechanism as #510/#511) to confirm domain control
cheaply before spending a production attempt. This time the canary itself
never succeeded — every attempt (5 over the 10-minute window, backoff
120s/120s/300s/300s) failed the same way, entirely on Let's Encrypt's side:
Let's Encrypt's multi-perspective ("secondary validation") checks could not
resolve the box's own sslip.io hostname at all, from LE's own validation
vantage points — a DNS lookup failure on LE's side against a wildcard DNS
service, not anything Caddy, the box, or #650 did. Because the canary never
clears, the flow never reaches the production issuer, so Caddy has no cert
to serve for the whole window and every client TLS handshake gets an
internal-error alert.
This is a different signature from #510/#511 (which got past the canary and
into production issuance, then hit a chain-download 404). Filing this as a
new occurrence in the same
deploy-test-flake family (see also #186, #190,#373) rather than reopening #510/#511, since the failing stage and the
upstream error are both different.
Why file rather than fix
Same trade-off #511 already laid out, and it still applies:
or sslip.io's side, re-running (or the next push's own deploy-test) would
very likely go green.
transient LE validation hiccup doesn't stall the whole box.
Filing so evidence accumulates here if this DNS-validation shape recurs,
rather than each occurrence re-deriving the diagnosis from scratch.
Repro / evidence
deploy-test (ipv4-full, true, false)(103097840168)ipv6-outputsleg on the same run passed.Deploy testruns before this one: all green.