youngle.au — vhost + TLS for 11 subdomains
youngle.au — vhost + TLS for 11 subdomains
Young's directive (2026-10-21): create certbot/TLS + nginx vhost + public-hostname
for youngle.au and 11 subdomains, all pointing at 161.33.71.67.
Also: sol.youngle.au must NOT be public; auth.youngle.au had an SSL cert error.
The two problems found
sol.youngle.au was not live — but looked like it was
There was no nginx vhost and no listener for it. DNS pointed at prod, so requests hit nginx's first 443 server block (docs), which returned a redirect to Authelia. That reads as "a site that redirects" — not as "nothing is served here". It was never decommissioned in nginx; it was never configured either.
auth.youngle.au served the wrong certificate
Authelia's config declared authelia_url: https://auth.youngle.au, but no vhost
served that hostname. With no default_server on :443, nginx answered every
unmatched hostname with the first 443 block — the docs vhost — so the TLS
handshake presented CN=docs.youngle.au. Hence the cert error, and the same
mechanism made 6 of the 11 subdomains fail the TLS handshake entirely (HTTP 000).
What was done
- ACME webroot —
/var/www/certbotserved from a newsites-enabled/acme-webroot.conf(default_server on :80), plus anacme-challengelocation added to the docs/pulse/yukonit :80 blocks. yukonit's ACME location pointed at the wrong webroot (/var/www/html) — fixed. - One SAN cert —
certbot certonly --webroot --cert-name younglecoveringyoungle.au+ all 10 subdomains. Issued 2026-10-21, expires 2027-01-19. Auto-renew verified (certbot renew --dry-run→ success). - Six new vhosts created and enabled:
vhost serves gate auth.youngle.auAuthelia SSO portal (:9091) bypass (public — it IS the login) sol.youngle.aunothing — return 444(connection dropped)retired www.youngle.autenant landing (:8091) public chat.youngle.auchat UI (:8092) public eve.youngle.auEVE receptionist (:8092) public solos.youngle.aufleet console (:8091) Authelia one_factor - Authelia access_control rewritten to state each surface explicitly
(public bypass vs gated one_factor) rather than relying on the
*.youngle.auwildcard, which would have gated the public storefronts too.
Verified (live, from LAB)
| domain | HTTP | cert |
|---|---|---|
| youngle.au | 000 (no apex vhost — not requested) | youngle.au |
| www.youngle.au | 200 | youngle.au |
| auth.youngle.au | 200 — Authelia page renders | youngle.au |
| chat.youngle.au | 200 | youngle.au |
| docs.youngle.au | 302 → auth.youngle.au | docs.youngle.au |
| eve.youngle.au | 200 | youngle.au |
| pulse.youngle.au | 200 | docs.youngle.au |
| sol.youngle.au | 000 — connection dropped (444) | youngle.au |
| solos.youngle.au | 302 → auth.youngle.au | youngle.au |
| web.youngle.au | 200 | youngle.au |
| yukonit.youngle.au | 200 | yukonit.youngle.au |
The lesson (worth recording)
One missing vhost became a 404 that looked like a redirect, and a missing default_server on :443 became a cert served to the wrong hostname. Both were invisible in the vhost listing and only appeared when a hostname was requested that had no server block of its own.
The guard: auth.youngle.au had a config pointing at it in Authelia but no
server block. A config that names a hostname the proxy does not serve is the
earliest signal — and it is exactly what a per-hostname probe catches.
Update (Young, 2026-10-21 later): youngle.au is the default cert
Young's rule: "default domain: youngle.au. Make youngle.au as default for cert and any subdomain will follow it."
What changed
- Re-issued the cert under the name
youngle.au(wasyoungle) — same SAN set, now the canonical cert name.certbot renew --dry-runpasses. - Every vhost now points at
/etc/letsencrypt/live/youngle.au/— docs, pulse, yukonit, web, auth, chat, eve, sol, solos, www. One cert, one renewal. 00-default.confadded — adefault_serveron :80 and :443 withserver_name _:- serves the
youngle.aucert for any hostname without its own vhost location / { return 444; }— an unknown host is dropped, not served- serves the ACME challenge path, so any future subdomain can be certified without touching a vhost first
- serves the
youngle.auapex vhost created — the tenant landing page (:8091), public.storefront-youngle-au.confenabled (it never was —web.youngle.auwas silently falling through to the old default). Now on the youngle.au cert.
The 444 default is the point
Before this change there was no default_server on :443, so every unmatched
hostname was answered by the first 443 block (docs) — which presented the docs
certificate. That is what produced the auth.youngle.au SSL error. Now an
unmatched hostname gets the right cert and a dropped connection, which is the
honest answer for a host that does not exist.
Verified (live)
| domain | HTTP | cert |
|---|---|---|
| youngle.au (apex) | 200 | youngle.au |
| www | 200 | youngle.au |
| auth | 200 | youngle.au |
| chat | 200 | youngle.au |
| docs | 302 → auth | youngle.au |
| eve | 200 | youngle.au |
| pulse | 200 | youngle.au |
| sol | 000 (dropped, retired) | youngle.au |
| solos | 302 → auth | youngle.au |
| web | 502 (upstream :8012 down) | youngle.au |
| yukonit | 502 (upstream :8012 down) | youngle.au |
The wildcard — what I could NOT do, and why
*.youngle.au (covering any subdomain, including ones not yet named) needs
DNS-01 challenge. HTTP-01 cannot prove a wildcard — Let's Encrypt refuses it,
as measured: "Client with the currently selected authenticator does not support
any combination of challenges that will satisfy the CA."
DNS for youngle.au is at Amazon Route 53 (ns1-3.partnerconsole.net).
A DNS-01 wildcard cert therefore needs Route 53 API credentials (an IAM user
with route53:ChangeResourceRecordSets on the hosted zone) plus the certbot
Route 53 plugin. We have no such credential on LAB or prod — I checked the
profile .env files, ~/.aws, and the shell environment.
So today: any subdomain must be added to the SAN list (one certbot --expand
command, which renewals keep) or given its own cert. The moment Route 53
credentials exist, one command swaps in a wildcard that covers every subdomain
permanently.
This is a credential procurement step, not a code step — and it belongs to the same lane as the other keys we hold.
Still open
youngle.auapex itself has a cert but no vhost (not requested — say if wanted)docs.youngle.auandpulse.youngle.austill use their old individual certs (both valid). The SAN cert covers them; consolidating is cosmetic.chat.youngle.aupoints at :8092 (pulse-site) — a placeholder until the real chat service is named.eve.youngle.aupoints at :8092 (pulse-site) — placeholder. The EVE agent containers are on tenant networks with no host port by design; exposing one needs a deliberate routing decision.

