Skip to content

Pin iPXE to v2.0.0-fog.7 - #1187

Merged
mastacontrola merged 1 commit into
working-1.6from
pin-ipxe-v2.0.0-fog.7
Aug 18, 2026
Merged

Pin iPXE to v2.0.0-fog.7#1187
mastacontrola merged 1 commit into
working-1.6from
pin-ipxe-v2.0.0-fog.7

Conversation

@mastacontrola

Copy link
Copy Markdown
Member

Makes HTTPS netboot work at all against a FOG server whose web certificate is issued by FOG's own CA — which is every -S install that has not supplied a public certificate.

FOG issues its Web CA with a critical nameConstraints extension, on purpose: it is what stops a compromised web leaf from being usable to impersonate anything outside this server's own names. Upstream iPXE has no parser for that extension, and a critical extension a validator cannot parse is one it must reject. So the Web CA was rejected before the leaf was ever considered, and every client died at the first chain with

Operation not supported (https://ipxe.org/3c16e283)

then reboot-looped.

Two fixes were available: stop constraining the CA, or teach iPXE the extension. fog-ipxe#6 does the second — permittedSubtrees/excludedSubtrees over dNSName and iPAddress, enforced across the whole validated path, with constraint types iPXE cannot evaluate refused at parse time so an unenforceable constraint fails closed rather than being silently skipped. Reasoning and the rejected alternatives are in docs/adr/0016-ipxe-enforces-x509-name-constraints.md (#1184).

Verified end to end on a UEFI Secure Boot VM: the stock binary fails to parse the Web CA; the patched one validates the chain and reaches the FOG boot menu over HTTPS.

Servers do not self-heal

/tftpboot is only rewritten when the installer re-runs. A server that builds iPXE with its own CA embedded ($rebuildIpxeWithMyCA) additionally needs that rebuild before the patched code is in its binaries — the stamp comparison in _needsLocalIpxeBuild() schedules it automatically off this version change, because the stamp records the iPXE version it was built from.

🤖 Generated with Claude Code

Makes HTTPS netboot work at all against a FOG server whose web
certificate is issued by FOG's own CA -- which is every -S install that
has not supplied a public certificate.

FOG issues its Web CA with a CRITICAL nameConstraints extension, on
purpose: it is what stops a compromised web leaf from being usable to
impersonate anything outside this server's own names. Upstream iPXE has
no parser for that extension, and a critical extension a validator
cannot parse is one it must reject. So the Web CA was rejected before
the leaf was ever considered, and every client died at the first chain
with

    Operation not supported (https://ipxe.org/3c16e283)

then reboot-looped. The two available fixes were to stop constraining
the CA, or to teach iPXE the extension. v2.0.0-fog.7 does the second:
permittedSubtrees and excludedSubtrees over dNSName and iPAddress,
enforced across the whole validated path, with constraint types iPXE
cannot evaluate refused at parse time so an unenforceable constraint
fails closed rather than being skipped. Reasoning and the rejected
alternatives: docs/adr/0016-ipxe-enforces-x509-name-constraints.md.

Servers do not self-heal. /tftpboot is only rewritten when the
installer re-runs, and a server that builds iPXE with its own CA
embedded ($rebuildIpxeWithMyCA) needs that rebuild to happen before the
patched code is in its binaries -- the stamp comparison in
_needsLocalIpxeBuild() schedules it automatically off this version
change.
@mastacontrola
mastacontrola merged commit f339cfc into working-1.6 Aug 18, 2026
3 checks passed
@mastacontrola
mastacontrola deleted the pin-ipxe-v2.0.0-fog.7 branch August 18, 2026 14:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant