fix(3086): the hive leaf stops naming two services it already covered
`DNS:forge.<domain>` and `DNS:matrix.<domain>` sat beside `DNS:*.<domain>`, which already covers them — a wildcard covers exactly one label and those are one label. Naming them read as policy, and that is why they outlived the thing they described: a configured service name no longer has to be under this hive's domain, and when it isn't, this is the one list it cannot join. Proved by execution rather than eval, because the SAN list is a printf argument filled in at runtime and eval can only show the template — the lesson from the gateway outage. openssl-verified against a CA carrying the real name constraint: old and new leaves agree on every name the hive serves, the wildcard genuinely stops at one label, and a sibling name added to this leaf fails. That last case came back stronger than expected: a nameConstraints violation invalidates the certificate, not the offending SAN, so one foreign name here would break the leaf for the dashboard and every other vhost sharing it. The comment says so now, and gateway.md's cert-shape paragraph no longer describes SANs that are gone.
This commit is contained in:
parent
660629a7c6
commit
a92f7351d9
2 changed files with 15 additions and 2 deletions
|
|
@ -163,9 +163,22 @@ let
|
|||
|
||||
# The hive's own leaf: signed by the hive CA, covering the hive domain
|
||||
# and its sub-domains.
|
||||
#
|
||||
# `forge.` and `matrix.` were listed here explicitly and both were
|
||||
# redundant with the wildcard beside them — a wildcard covers exactly
|
||||
# one label, and those are one label. Naming them read as policy
|
||||
# ("these two services live under this leaf"), which is the reason they
|
||||
# outlived it: a configured service name is no longer necessarily under
|
||||
# this domain, and when it isn't, this is the one list it cannot join.
|
||||
# The hive CA is `nameConstraints=permitted;DNS:<hive domain>`, and a
|
||||
# violation invalidates the CERTIFICATE rather than the offending name
|
||||
# — measured with openssl, not reasoned about — so one sibling name
|
||||
# added here takes the leaf down for the dashboard and every other
|
||||
# vhost sharing it. Configured service names get the swarm-services
|
||||
# leaf below, whose sub-CA is constrained to exactly those names.
|
||||
signHiveLeaf = ''
|
||||
${signLeafScript} "$d" gateway ${lib.escapeShellArg domain} \
|
||||
${lib.escapeShellArg "DNS:${domain},DNS:forge.${domain},DNS:matrix.${domain},DNS:*.${domain}"} \
|
||||
${lib.escapeShellArg "DNS:${domain},DNS:*.${domain}"} \
|
||||
"$d/ca.pem" "$d/ca-key.pem"
|
||||
'';
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue