Files
fleet/articles/enable-okta-verify-on-windows-using-a-scep-configuration-profile.md
T
+3 c9803c2a8f Docs: non-proxied cert renewal (#45695)
**Related issue:** Resolves #44348

**Base branch:** `docs-v4.86.0` (not `main`) per the docs release
process.

## What this PR does

Updates four customer-facing guides and adds a release-notes entry for
Phase 2's opt-in cert renewal feature (shipped via #45696). Frames the
marker as an opt-in enhancement: profiles without it continue to work as
in 4.85; profiles with it activate auto-renewal.

| Guide | Change |
|-------|--------|
| `connect-end-user-to-wifi-with-certificate.md` | Migrated 11 legacy
`\$FLEET_VAR_SCEP_RENEWAL_ID` refs to the preferred name; added
back-compat callout. |
| `okta-conditional-access-integration.md` | Removed "Automatic renewal
coming soon" line; added one-time upgrade-redeploy callout for existing
customers. |
| `enable-okta-verify-on-macOS-with-configuration-profile.md` | Added
marker to example profile OU; added opt-in note and CA-side
OU-preservation verification step. Coordinated with the earlier
example-profile update from #43293 already on `docs-v4.86.0`. |
| `enable-okta-verify-on-windows-using-a-scep-configuration-profile.md`
| Replaced manual-redeployment narrative with auto-renewal guidance.
Kept the policy-based expiry-monitoring SQL as an optional safeguard. |

Release-notes entry (`changes/40639-non-proxied-cert-renewal`)
consolidates Phase 2 customer-visible behavior in three bullets.

## Dependencies

The Conditional Access guide's "new setups: no extra action needed"
framing assumes #45662 (the Fleet-side template marker addition) has
landed — it has, merged into the feature branch and onward into main via
#45696.

# Checklist for submitter

- [x] Changes file added for user-visible changes

## Testing

- [x] Doc review only — no code changes

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Automatic certificate renewal is now supported for SCEP and ACME
certificates from external certificate authorities, enabled by default
for new deployments with an opt-in path for existing customers
* macOS devices with ACME-bearing configuration profiles will now
surface hardware-bound certificates in device vitals

<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Rachael Shaw <r@rachael.wtf>
Co-authored-by: Marko Lisica <83164494+marko-lisica@users.noreply.github.com>
Co-authored-by: kilo-code-bot[bot] <240665456+kilo-code-bot[bot]@users.noreply.github.com>
Co-authored-by: kiloconnect[bot] <240665456+kiloconnect[bot]@users.noreply.github.com>
Co-authored-by: melpike <79950145+melpike@users.noreply.github.com>
Co-authored-by: Noah Talerman <47070608+noahtalerman@users.noreply.github.com>
Co-authored-by: Jordan Montgomery <elijah.jordan.montgomery@gmail.com>
Co-authored-by: Jonathan Katz <44128041+jkatz01@users.noreply.github.com>
Co-authored-by: Victor Lyuboslavsky <2685025+getvictor@users.noreply.github.com>
Co-authored-by: Magnus Jensen <magnus@fleetdm.com>
Co-authored-by: RachelElysia <71795832+RachelElysia@users.noreply.github.com>
Co-authored-by: Scott Gress <scottmgress@gmail.com>
2026-07-10 17:37:50 -05:00

6.6 KiB

Enable Okta Verify on Windows using a SCEP configuration profile

Introduction

This guide explains how to enable Okta Verify on Windows using a SCEP client certificate delivered by the Windows ClientCertificateInstall CSP. Fleet supports Exec commands in configuration profiles, allowing you to deploy the SCEP configuration and trigger enrollment in a single profile.

Files

Profile XML: install Okta attestation certificate - [Bundle].xml

The profile is ready to use as-is. Fleet will replace the $FLEET_SECRET_* variables with your actual values when deploying to each device.

Prerequisites

1. Gather your Okta details

Collect from your Okta tenant:

  • SCEP URL: Your Okta SCEP endpoint
  • SCEP Challenge: Your static SCEP challenge (plain text, avoid special characters)
  • CA Thumbprint: The SHA-256 thumbprint of your Okta CA certificate

2. Get your CA thumbprint

Download your Okta CA certificate and extract the SHA-256 thumbprint.

macOS/Linux:

openssl x509 -in ~/Downloads/ca.cer -noout -fingerprint -sha256

Windows:

certutil -hashfile ca.cer SHA256

Output will look like:

SHA256 Fingerprint=E2:18:D7:A7:B0:DF:ED:79:B2:05:73:BA:79:CB:14:B1:FE:EA:D2:7B

Remove the colons:

E218D7A7B0DFED79B20573BA79CB14B1FEEAD27B

3. SCEP challenge requirements

  • Your SCEP challenge should be plain text
  • Avoid special characters that can break XML or transport
  • Recommended: letters, numbers only
  • If your challenge contains ! @ # $ % ^ & * , ( ) _, rotate to a simpler value

Quick checklist

  • SCEP URL confirmed
  • SCEP challenge validated (plain text, simple characters)
  • CA thumbprint ready (no colons, no spaces)

Deployment

1. Create Fleet secrets

Follow Fleet's guide: https://fleetdm.com/guides/secrets-in-scripts-and-configuration-profiles

Create these secrets in Fleet (Controls > Variables) or via GitOps:

Secret name Value
OKTA_SCEP_URL Your SCEP endpoint URL
OKTA_SCEP_CHALLENGE Your challenge (plain text, simple characters)
OKTA_CA_THUMBPRINT Your thumbprint (no colons, no spaces)

2. Deploy the profile

  1. Download the profile XML (link above)
  2. Navigate to Controls > OS settings > Custom settings in Fleet
  3. Upload the XML file (no editing required)

Fleet automatically replaces $FLEET_SECRET_OKTA_SCEP_URL, $FLEET_SECRET_OKTA_SCEP_CHALLENGE, and $FLEET_SECRET_OKTA_CA_THUMBPRINT when deploying. The certificate ID is automatically managed by Fleet using $FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID.

Verify the certificate

Check the User cert store

Open PowerShell as the logged-in user (not administrator):

Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object {$_.Subject -like "*managementAttestation*"}

Expected output:

Thumbprint                                Subject
----------                                -------
A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0  CN=<SERIAL> managementAttestation

Check the device management logs

Get-WinEvent -LogName Microsoft-Windows-DeviceManagement-Enterprise-Diagnostics-Provider/Admin -MaxEvents 50

Verify in Okta

  1. Log in to Okta Admin Console
  2. Navigate to Reports > System Log
  3. Filter for certificate issued events (eventType eq "pki.cert.issue")
  4. Confirm the certificates were issued successfully (The certificate CN should match the hosts serial number)

Troubleshooting

Exec returns 404

  • Check that all three Fleet secrets exist (OKTA_SCEP_URL, OKTA_SCEP_CHALLENGE, OKTA_CA_THUMBPRINT)
  • Verify the profile was uploaded correctly
  • Review Device Management logs for details

Enrollment fails immediately

Check:

  • ServerURL is correct
  • CAThumbprint format (no colons or spaces)
  • Device can reach the SCEP URL (network/firewall)

Challenge rejected

  • Try a simpler plain text challenge (alphanumeric only)
  • Avoid special characters, especially underscores
  • If your challenge contains ! @ # $ % ^ & * ( ) _, rotate to a simpler value in Okta

Nothing in Cert:\LocalMachine\My

Note: Okta requires certificates in the User store (Cert:\CurrentUser\My), not the Device store.

Review Device Management logs:

Get-WinEvent -LogName Microsoft-Windows-DeviceManagement-Enterprise-Diagnostics-Provider/Admin -MaxEvents 50

Automatic renewal

Include $FLEET_VAR_CERTIFICATE_RENEWAL_ID in the SubjectName OU of your SCEP profile to opt into auto-renewal. Fleet renews certificates about 30 days before expiration; new profiles deployed without this variable continue to work but must be renewed manually.

Example SubjectName containing the marker:

CN=$FLEET_VAR_HOST_HARDWARE_SERIAL managementAttestation,OU=$FLEET_VAR_CERTIFICATE_RENEWAL_ID

CA-side requirement: your SCEP CA must preserve the Subject OU in issued certificates. Verify by decoding an issued cert (openssl x509 -text) and confirming the OU contains fleet-<profile_uuid> after deployment.

Monitor expiration (optional safeguard)

If you'd like a manual safeguard alongside auto-renewal, use a Fleet policy to flag devices with certificates expiring soon:

SELECT 1 
FROM certificates
WHERE 
    common_name LIKE '%managementAttestation%'
    AND julianday(not_valid_after) - julianday('now') < 30;

The policy will:

  • Fail: When a certificate exists and expires within 30 days
  • Pass: When no certificate exists yet, or certificate is valid for more than 30 days

If you haven't opted into auto-renewal, redeploy the same configuration profile to trigger renewal manually.

Important notes

  • Fleet secrets: Fleet does not hide secrets in profile results. Make sure all three secrets are created before deploying (OKTA_SCEP_URL, OKTA_SCEP_CHALLENGE, OKTA_CA_THUMBPRINT).
  • User vs Device store: Okta requires certificates in the User store. The profile uses ./User/ paths. If you use ./Device, the device will not be marked as managed in Okta.
  • Certificate ID: Fleet automatically manages the certificate node name using $FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID - no manual configuration needed.