Skip to content

docs(fleet): document Windows enrollment via WS1 NDES bridge#517

Merged
tashian merged 6 commits into
mainfrom
carl/fleet-windows-ndes-bridge
May 26, 2026
Merged

docs(fleet): document Windows enrollment via WS1 NDES bridge#517
tashian merged 6 commits into
mainfrom
carl/fleet-windows-ndes-bridge

Conversation

@tashian
Copy link
Copy Markdown
Contributor

@tashian tashian commented May 21, 2026

Summary

Rewrite of tutorials/connect-fleet-dm-to-smallstep.mdx to make each OS a self-contained section and to fix Windows so it actually enrolls end-to-end.

Per-OS structure. Each platform now has its own numbered steps ending in a confirmation step:

  • Apple devices (macOS, iOS, iPadOS) — Fleet's native Smallstep CA, .mobileconfig SCEP profile, macOS agent deploy.
  • Linux — agent-only (no MDM CA); post-install script writes agent.yaml and starts the service. TPM attestation handles registration.
  • Windows — bridges to Smallstep's NDES-compatible endpoints via a Workspace ONE connector (Fleet's native Smallstep CA doesn't yet cover Windows — see fleetdm/fleet#28488).
  • GitOps with fleetctl — promoted to a top-level section after the OS flows, with the previously-separate Windows GitOps notes merged in.

Windows: single ordered SyncML profile. Fleet doesn't let you order separately-uploaded SyncML profiles, but within one profile it processes top-level commands in document order (confirmed via Fleet's own Okta Verify bundle). The two previous files (smallstep-windows-root-ca.xml + smallstep-windows-scep.xml) are merged into one smallstep-windows.xml ordered as: Root CA <Replace> → SCEP CSP <Replace> items → <Exec> Enroll last. This guarantees the trust chain is in place before the SCEP install runs.

Windows: agent bootstrap via Fleet Scripts. Fleet has no native registry-management UI, so a new step uses Controls → Scripts to run a PowerShell script that writes TeamSlug, CAFingerprint, and Certificate to HKLM:\Software\Policies\Smallstep. The Certificate selector matches the SCEP-issued bootstrap cert by issuer + cn=$env:COMPUTERNAME. Mirrors the Workspace ONE pattern. Pairs with a Fleet policy automation for self-healing.

Clearer upload locations. Both Apple and Windows steps explicitly call out Controls → OS settings → Configuration profiles for SyncML / .mobileconfig upload.

Windows: SHA-1 CAThumbprint. Documents the SHA-1 / SHA-256 selector in the Smallstep WS1 connector UI and uses SHA-1 for Windows CAThumbprint as required by the SCEP CSP.

Test plan

  • Get a Windows host to receive a Smallstep-issued certificate via Fleet end-to-end (merged SyncML profile + PowerShell registry script + agent install)
  • Verify SHA-1 CAThumbprint path installs cleanly
  • Confirm Smallstep agent on Windows reads HKLM:\Software\Policies\Smallstep and registers with the team via the SCEP-issued bootstrap cert
  • Verify macOS + iOS flow still works end-to-end after the restructure
  • Verify Linux post-install script + TPM attestation flow still works
  • Confirm Smallstep support has set the WS1-connector dynamic-challenge TTL to 1 hour (per Integrate with Smallstep via SCEP w/ dynamic challenge fleetdm/fleet#28488 comment)
  • Confirm preview renders correctly with pnpm dev from the smallstep.com repo

🤖 Generated with Claude Code

Fleet's native Smallstep CA type doesn't yet support Windows
(fleetdm/fleet#28488), so Windows SCEP enrollment has to go through
Fleet's Dynamic SCEP (Okta/NDES) CA type pointed at Smallstep's
NDES-emulating endpoints. Those endpoints are exposed by the Smallstep
Workspace ONE connector, which can be created with placeholder OAuth
credentials when the customer doesn't operate a real WS1 tenant.

Remove the previously documented Windows SyncML profile that used the
SMALLSTEP_* Fleet variables (those aren't wired up for Windows) and
replace it with a dedicated "Windows: bridge via the Workspace ONE
connector" section covering: WS1 connector creation with placeholders,
Fleet NDES CA setup, SyncML SCEP and Root CA profiles using
NDES_SCEP_PROXY_URL and NDES_SCEP_CHALLENGE, GitOps stanza, and a
Windows verification recipe. Also flag the Fleet 1-hour challenge TTL
expectation as a setup item to confirm.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@tashian tashian requested a review from a team as a code owner May 21, 2026 23:01
@tashian tashian enabled auto-merge May 21, 2026 23:29
tashian and others added 4 commits May 26, 2026 07:20
…stry script

Restructure each OS into a self-contained section with its own confirmation
step. Linux is intentionally short (no MDM CA in Fleet, agent-only).

Windows changes:
- Merge the separate Root CA and SCEP SyncML profiles into one
  smallstep-windows.xml, ordered Root CA -> SCEP nodes -> Exec Enroll, so
  the chain is in place before enrollment runs. Fleet processes top-level
  items in document order within a single profile.
- Call out the Fleet console upload path
  (Controls -> OS settings -> Configuration profiles).
- Add a step that uses Fleet Scripts to write TeamSlug, CAFingerprint, and
  Certificate to HKLM:\\Software\\Policies\\Smallstep so the Windows agent
  can bootstrap from the SCEP-issued certificate.
- Add a deploy-the-agent step and a Windows-specific confirmation.

Promote the GitOps section to a top-level section after Windows and merge
the Windows GitOps notes in.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Copy link
Copy Markdown

@darkfronza darkfronza left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks much better, we still need to figure the missing bits for registry and bootstrap cert for Fleet.

@tashian tashian merged commit bd28a40 into main May 26, 2026
4 checks passed
@tashian tashian deleted the carl/fleet-windows-ndes-bridge branch May 26, 2026 23:21
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.

2 participants