docs: mark the FUT Squad Update cert fix applied (fbc0da2)

Updates status from root-caused to fixed, and records that option 1 (IP SAN) was
taken across the three cert generators, with the verification and the operator-gated
production rebuild that remains.
This commit is contained in:
funman300
2026-08-18 15:58:18 +00:00
parent fbc0da2a1b
commit 5c40b4993f
+23 -15
View File
@@ -1,7 +1,10 @@
# FIFA 17 "FUT Squad Update" download failure — root cause
**Status:** root-caused, not yet fixed. Blocks any FIFA session pointed at a stack whose
roster server presents the current self-signed certificate.
**Status:** FIXED in the cert generators (commit `fbc0da2`) — the SAN now carries the
advertised IP. Verified without the client (a verifying TLS client rejects the old
DNS-only cert by IP and accepts the new one; the entrypoint reconcile is idempotent).
Live confirmation needs the production container rebuilt with `OPENFUT_ADVERTISE` set,
which is operator-gated. See "Fix options (applied)" below.
**Symptom (client):** entering the FUT hub shows
@@ -96,18 +99,23 @@ forces the fetch — but that has not been measured. The known-good hook log use
control (Aug 12 19:13) **predates the Aug 13 certificate regeneration**, so it is not
evidence about the current certificate.
## Fix options (none applied)
## Fix options — option 1 applied (`fbc0da2`)
1. **Reissue the certificate with an `iPAddress` SAN** for the advertised address. Smallest
change, addresses the concrete mismatch, and benefits the redirector too. Note
`openfut-tls` exists precisely so the redirector and roster hosts cannot configure TLS
separately — the 2026-08-11 mismatch it was written for is the same class of bug.
2. **Serve the roster over plain HTTP** for an isolated stack, by pointing
`ROSTERUPDATE_URL`/`ROSTER_URL` at a staging-owned HTTP server. Sidesteps TLS entirely;
only acceptable off production.
3. **Find the real validation site** on the roster path and extend the patch set. Most
faithful, most work, and the only option that restores the original assumption.
1. **Reissue the certificate with an `iPAddress` SAN** **APPLIED.** The three cert
generators now put the advertised IP in the SAN: the docker entrypoint reconciles it at
startup from `OPENFUT_ADVERTISE` (runtime value, unknown at build time; reissued only
when missing, so restarts don't churn the fingerprint), the Dockerfile keeps `openssl`
in the runtime image and bakes a loopback-IP baseline, and `openfut-fut.sh` defaults the
SAN IP to the host's primary LAN IP. Smallest change, benefits the redirector too. Note
`openfut-tls` only *loads* the cert — it does not generate it — so the generation fix
lives in these three scripts regardless of whether the roster is served by Python or the
Rust `openfut-roster-host`.
2. **Serve the roster over plain HTTP** — not taken. Sidesteps TLS entirely but only
acceptable off production, and option 1 fixes it properly everywhere.
3. **Find the real validation site** on the roster path and extend the patch set — not
needed once the SAN matches; kept on record as the most-faithful alternative.
Option 1 is the recommended starting point because it is testable without the client:
a probe that validates hostname/IP against the presented certificate will fail before the
fix and pass after.
Option 1 was chosen because it is testable without the client: a verifying TLS client
checking the cert by IP fails on the old cert and passes on the new one. That test now
passes (`scripts`-style probe run at fix time); the remaining step is the operator
rebuilding the production container so the reissued cert is actually served.