Add Windows SCEP profile with Exec support and $FLEET_VAR_HOST_HARDWARE_SERIAL for Okta certificate enrollment (#39204)
This pull request updates the Okta Verify on Windows SCEP configuration documentation and profile to simplify deployment with Fleet and reduce manual steps. The changes make the process more reliable by standardizing variable usage, improving instructions, and automating certificate enrollment. **Key improvements and changes:** **Documentation and workflow simplification:** - The guide in `articles/enable-okta-verify-on-windows-using-a-scep-configuration-profile.md` was rewritten for clarity and to reflect the new automated approach. Manual editing of XML and scripts is no longer needed; Fleet-managed variables and secrets now handle all required values. Steps for gathering prerequisites, deploying, verifying, and renewing certificates are streamlined, and troubleshooting guidance is expanded. - The subject name in the certificate is now set to use the hardware serial (`$FLEET_VAR_HOST_HARDWARE_SERIAL`) instead of the host UUID, improving uniqueness and traceability. ([docs/solutions/windows/configuration-profiles/install Okta attestation certificate - [Bundle].xmlL77-R89](diffhunk://#diff-d8fc2c8add5725599bdc41a7b417dc3978cfc34eb6fcb8950db513f2b5799aa5L77-R89)) **Secret management and security:** - The configuration profile now references Fleet secrets (`$FLEET_SECRET_OKTA_SCEP_URL`, `$FLEET_SECRET_OKTA_SCEP_CHALLENGE`, `$FLEET_SECRET_OKTA_CA_THUMBPRINT`) directly, removing the need for manual substitution and reducing risk of misconfiguration. ([docs/solutions/windows/configuration-profiles/install Okta attestation certificate - [Bundle].xmlL98-R141](diffhunk://#diff-d8fc2c8add5725599bdc41a7b417dc3978cfc34eb6fcb8950db513f2b5799aa5L98-R141)) **Automated certificate enrollment:** - An `<Exec>` command is added to the XML profile to automatically trigger SCEP enrollment upon deployment, further reducing manual intervention. ([docs/solutions/windows/configuration-profiles/install Okta attestation certificate - [Bundle].xmlL98-R141](diffhunk://#diff-d8fc2c8add5725599bdc41a7b417dc3978cfc34eb6fcb8950db513f2b5799aa5L98-R141)) These changes make the Okta Verify SCEP configuration for Windows much easier to deploy and maintain, with improved automation and clearer instructions. --------- Co-authored-by: Brock Walters <153771548+nonpunctual@users.noreply.github.com>
This commit is contained in:
co-authored by
Brock Walters
parent
082df31478
commit
e51561914b
@@ -2,216 +2,173 @@
|
||||
|
||||
## Introduction
|
||||
|
||||
This guide explains how to enable [Okta Verify](https://help.okta.com/en-us/content/topics/mobile/okta-verify-overview.htm) on Windows using a SCEP client certificate delivered by the Windows **ClientCertificateInstall** CSP and then applied using an **Exec** command. This pattern is useful when your MDM payload cannot send **Add or Replace** nodes together with an **Exec** in one transaction.
|
||||
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.
|
||||
|
||||
You will deploy the SCEP profile first, then call **Enroll** via Exec to request the client certificate.
|
||||
## Files
|
||||
|
||||
**Files**
|
||||
* [Profile XML](https://github.com/fleetdm/fleet/blob/main/docs/solutions/windows/configuration-profiles/install%20Okta%20attestation%20certificate%20-%20%5BBundle%5D.xml)
|
||||
* [Powershell script](https://github.com/fleetdm/fleet/blob/main/docs/solutions/windows/scripts/trigger%20scep%20enrollment.ps1)
|
||||
**Profile XML**: [install Okta attestation certificate - [Bundle].xml](https://github.com/fleetdm/fleet/blob/main/docs/solutions/windows/configuration-profiles/install%20Okta%20attestation%20certificate%20-%20%5BBundle%5D.xml)
|
||||
|
||||
---
|
||||
|
||||
## Order at a glance
|
||||
|
||||
1. Get your CA **thumbprint**, choose **{yourCertName}**, and locate your SCEP **URL** and **Challenge**.
|
||||
2. Create Fleet **secrets** for URL, Challenge, CA thumbprint, and API token.
|
||||
3. Use the Fleet repo XML CSP profile and replace only the required placeholders.
|
||||
4. Deploy the profile to devices.
|
||||
5. Update the **Exec** script to use the same `{yourCertName}` and your secrets, then run it.
|
||||
6. Verify the certificate is installed.
|
||||
7. Plan and automate **renewal**.
|
||||
|
||||
---
|
||||
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
|
||||
|
||||
* Windows devices enrolled to Fleet MDM
|
||||
* Okta SCEP endpoint with a static challenge
|
||||
* Root CA certificate thumbprint for the SCEP issuing CA
|
||||
* Fleet API token stored as a secret
|
||||
* Optional GitOps workflow if you manage Fleet configuration as code
|
||||
### 1. Gather your Okta details
|
||||
|
||||
---
|
||||
Collect from your Okta tenant:
|
||||
|
||||
## Step 1. Collect your values
|
||||
* **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
|
||||
|
||||
### 1.1 Get the CA thumbprint
|
||||
### 2. Get your CA thumbprint
|
||||
|
||||
**Windows PowerShell**
|
||||
```powershell
|
||||
Get-FileHash -Path "C:\Path\To\ca.cer" -Algorithm SHA256 | Select-Object -ExpandProperty Hash
|
||||
```
|
||||
Download your Okta CA certificate and extract the SHA-256 thumbprint.
|
||||
|
||||
**macOS or Linux**
|
||||
**macOS/Linux**:
|
||||
```bash
|
||||
openssl x509 -in ~/Downloads/ca.cer -noout -fingerprint -sha256
|
||||
# Output looks 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
|
||||
```
|
||||
|
||||
Use the hex string without colons or spaces in the secret you will create below.
|
||||
|
||||
### 1.2 Choose your SCEP node name
|
||||
|
||||
Pick a simple value for `{yourCertName}`, for example `OKTA` or `OKTAVERIFY`. You will use this exact value:
|
||||
* in the XML profile path `.../SCEP/{yourCertName}/Install/...`
|
||||
* in the Exec path `.../SCEP/{yourCertName}/Install/Enroll`
|
||||
|
||||
### 1.3 Get your SCEP URL and Challenge
|
||||
|
||||
* `{yourScepUrl}` is your Okta SCEP endpoint.
|
||||
* `{yourScepChallenge}` is your static SCEP challenge. This profile expects **plain text**. Avoid special characters that can break XML or transport. Recommended: letters, numbers, underscore. If your challenge contains characters such as `! @ # $ % ^ & * ( )`, rotate to a simpler value.
|
||||
|
||||
**Quick checklist**
|
||||
* {yourCertName} chosen
|
||||
* {yourScepUrl} confirmed
|
||||
* {yourScepChallenge} validated (plain text, simple characters)
|
||||
* {yourScepCAThumbprint} ready (no colons, no spaces)
|
||||
|
||||
---
|
||||
|
||||
## Step 2. 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 you collected |
|
||||
|---|---|
|
||||
| `FLEET_SECRET_OKTA_SCEP_URL` | `{yourScepUrl}` |
|
||||
| `FLEET_SECRET_OKTA_SCEP_CHALLENGE` | `{yourScepChallenge}` (plain text, simple characters) |
|
||||
| `FLEET_SECRET_OKTA_CA_THUMBPRINT` | SHA256 thumbprint with no colons, no spaces
|
||||
| `FLEET_SECRET_API` | Fleet API token used by the Exec script |
|
||||
|
||||
Optional convenience secret:
|
||||
* `FLEET_SECRET_OKTA_CERT_NAME` set to `{yourCertName}`
|
||||
|
||||
**Security notes**
|
||||
* Fleet does not hide the secret in script results. Don't print/echo your secrets to the console output.
|
||||
|
||||
---
|
||||
|
||||
## Step 3. Use Fleet’s XML CSP profile
|
||||
|
||||
Source file in the Fleet repo:
|
||||
```
|
||||
docs/solutions/Windows/configuration-profiles/install Okta attestation certificate - [Bundle].xml
|
||||
**Windows**:
|
||||
```powershell
|
||||
certutil -hashfile ca.cer SHA256
|
||||
```
|
||||
|
||||
Only change the following placeholders:
|
||||
|
||||
* `{yourCertName}` set to the SCEP node name you chose in Step 1.2
|
||||
* `{yourScepUrl}` replaced with `$FLEET_SECRET_OKTA_SCEP_URL`
|
||||
* `{yourScepChallenge}` replaced with `$FLEET_SECRET_OKTA_SCEP_CHALLENGE` (plain text, simple characters)
|
||||
* `{yourScepCAThumbprint}` replaced with `$FLEET_SECRET_OKTA_CA_THUMBPRINT` (no colons, no spaces)
|
||||
|
||||
**Important**
|
||||
Use the same `{yourCertName}` in both the profile path and the Exec path. If they differ, the Exec will 404.
|
||||
|
||||
### Replace just these lines in the profile
|
||||
|
||||
```xml
|
||||
<!-- SCEP Server URL -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./Device/Vendor/MSFT/ClientCertificateInstall/SCEP/{yourCertName}/Install/ServerURL</LocURI>
|
||||
</Target>
|
||||
<Meta><Format xmlns="syncml:metinf">chr</Format></Meta>
|
||||
<Data>$FLEET_SECRET_OKTA_SCEP_URL</Data>
|
||||
</Item>
|
||||
|
||||
<!-- SCEP Challenge (plain text) -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./Device/Vendor/MSFT/ClientCertificateInstall/SCEP/{yourCertName}/Install/Challenge</LocURI>
|
||||
</Target>
|
||||
<Meta><Format xmlns="syncml:metinf">chr</Format></Meta>
|
||||
<Data>$FLEET_SECRET_OKTA_SCEP_CHALLENGE</Data>
|
||||
</Item>
|
||||
|
||||
<!-- SCEP CA Thumbprint (no colons) -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./Device/Vendor/MSFT/ClientCertificateInstall/SCEP/{yourCertName}/Install/CAThumbprint</LocURI>
|
||||
</Target>
|
||||
<Meta><Format xmlns="syncml:metinf">chr</Format></Meta>
|
||||
<Data>$FLEET_SECRET_OKTA_CA_THUMBPRINT</Data>
|
||||
</Item>
|
||||
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
|
||||
```
|
||||
|
||||
Keep the other defaults from the file (KeyLength 2048, KeyUsage 160, HashAlgorithm `SHA-1`, SubjectName `CN=$FLEET_VAR_HOST_UUID managementAttestation`, EKUMapping, RetryCount, RetryDelay).
|
||||
|
||||
Deploy the profile to your Windows hosts using Fleet.
|
||||
|
||||
---
|
||||
|
||||
## Step 4. Update the Exec script and run Enroll
|
||||
|
||||
Script location in repo:
|
||||
`docs/solutions/Windows/scripts/trigger-scep-enrollment.ps1`
|
||||
|
||||
Your Exec must target the same `{yourCertName}` as in the profile. Example path:
|
||||
Remove the colons:
|
||||
```
|
||||
./Device/Vendor/MSFT/ClientCertificateInstall/SCEP/{yourCertName}/Install/Enroll
|
||||
E218D7A7B0DFED79B20573BA79CB14B1FEEAD27B
|
||||
```
|
||||
|
||||
Update your PowerShell script to read the API token from the secret, set your node name, and build the correct LocURI.
|
||||
### 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)
|
||||
4. Assign to your team or hosts
|
||||
|
||||
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):
|
||||
|
||||
```powershell
|
||||
# ----- USER SETTINGS -----
|
||||
# Add your secrets in Fleet (Controls > Variables) or via GitOps.
|
||||
# The variable named "API" becomes FLEET_SECRET_API
|
||||
# Full guidance: https://fleetdm.com/guides/secrets-in-scripts-and-configuration-profiles
|
||||
|
||||
$NODE_NAME = "OKTA" # must match {yourCertName} in the XML
|
||||
$FLEET_API = "$FLEET_SECRET_API" # injected by Fleet
|
||||
|
||||
$locUri = "./Device/Vendor/MSFT/ClientCertificateInstall/SCEP/$NODE_NAME/Install/Enroll"
|
||||
# ...construct and send the Exec command body referencing $locUri...
|
||||
Get-ChildItem -Path Cert:\CurrentUser\My | Where-Object {$_.Subject -like "*managementAttestation*"}
|
||||
```
|
||||
|
||||
Run the script from Fleet so secrets inject automatically.
|
||||
Expected output:
|
||||
```
|
||||
Thumbprint Subject
|
||||
---------- -------
|
||||
A1B2C3D4E5F6G7H8I9J0K1L2M3N4O5P6Q7R8S9T0 CN=<SERIAL> managementAttestation
|
||||
```
|
||||
|
||||
---
|
||||
### Check the device management logs
|
||||
|
||||
## Step 5. Verify enrollment
|
||||
|
||||
**PowerShell**
|
||||
```powershell
|
||||
Get-ChildItem Cert:\LocalMachine\My |
|
||||
Where-Object { $_.Subject -like "*managementAttestation*" } |
|
||||
Format-List Subject, Thumbprint, NotAfter
|
||||
Get-WinEvent -LogName Microsoft-Windows-DeviceManagement-Enterprise-Diagnostics-Provider/Admin -MaxEvents 50
|
||||
```
|
||||
|
||||
**GUI**
|
||||
* Open `certlm.msc`
|
||||
* Personal > Certificates
|
||||
* Confirm a certificate whose Subject contains `managementAttestation`
|
||||
### Verify in Okta
|
||||
|
||||
---
|
||||
|
||||
## Step 6. Renewal
|
||||
|
||||
* Automated workflow. Use a Fleet query to find certificates expiring within 30 days and trigger the Exec command for those hosts.
|
||||
|
||||
Find certs expiring within 30 days:
|
||||
```TODO!
|
||||
```
|
||||
|
||||
---
|
||||
1. Log in to Okta Admin Console
|
||||
2. Navigate to **Reports** > **System Log**
|
||||
3. Filter for device attestation events
|
||||
4. Confirm the device appears as managed
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
* Exec returns 404: node name mismatch. Ensure `{yourCertName}` in XML equals `$NODE_NAME` in the script.
|
||||
* Enrollment fails immediately: check `ServerURL`, `CAThumbprint` format, and that the device can reach the SCEP URL.
|
||||
* Challenge rejected: try a simpler plain text challenge, or base64 encode and update the XML `<Data>`.
|
||||
* Nothing in `Cert:\LocalMachine\My`: review Device Management logs
|
||||
```powershell
|
||||
Get-WinEvent -LogName Microsoft-Windows-DeviceManagement-Enterprise-Diagnostics-Provider/Admin -MaxEvents 50
|
||||
```
|
||||
### 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:
|
||||
```powershell
|
||||
Get-WinEvent -LogName Microsoft-Windows-DeviceManagement-Enterprise-Diagnostics-Provider/Admin -MaxEvents 50
|
||||
```
|
||||
|
||||
## Plan and automate renewal
|
||||
|
||||
### Monitor expiration
|
||||
|
||||
Use a Fleet policy to identify devices with certificates expiring within 30 days:
|
||||
|
||||
```sql
|
||||
SELECT 1
|
||||
FROM certificates
|
||||
WHERE
|
||||
common_name LIKE '%managementAttestation%'
|
||||
AND julianday(not_valid_after) - julianday('now') < 30;
|
||||
```
|
||||
|
||||
This policy will:
|
||||
- **Fail**: When a certificate exists and expires within 30 days (needs renewal)
|
||||
- **Pass**: When no certificate exists yet, or certificate is valid for more than 30 days
|
||||
|
||||
### Automated workflow
|
||||
|
||||
To renew certificates, you can:
|
||||
|
||||
**Manual redeployment**: Redeploy the same configuration profile to trigger renewal
|
||||
|
||||
## 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.
|
||||
|
||||
---
|
||||
|
||||
|
||||
+28
-20
@@ -1,9 +1,9 @@
|
||||
<Add>
|
||||
<!-- Okta needs this certificate deployed to the Users cert store. Using the ./Device LocURI will result in the device not being marked as managed -->
|
||||
<!-- Name of SCEP node -->
|
||||
<!-- SCEP node name - Fleet will replace with certificate ID -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">node</Format>
|
||||
@@ -14,7 +14,7 @@
|
||||
<!-- Retry count for SCEP installation -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/RetryCount</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/RetryCount</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">int</Format>
|
||||
@@ -26,7 +26,7 @@
|
||||
<!-- Retry delay for SCEP installation -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/RetryDelay</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/RetryDelay</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">int</Format>
|
||||
@@ -38,7 +38,7 @@
|
||||
<!-- Key Usage - keep default for Okta -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/KeyUsage</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/KeyUsage</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">int</Format>
|
||||
@@ -50,7 +50,7 @@
|
||||
<!-- Key Length - min 2048 for Okta -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/KeyLength</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/KeyLength</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">int</Format>
|
||||
@@ -62,7 +62,7 @@
|
||||
<!-- Hash Algorithm - keep default for Okta -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/HashAlgorithm</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/HashAlgorithm</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">chr</Format>
|
||||
@@ -74,19 +74,19 @@
|
||||
<!-- CN - keep default for Okta -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/SubjectName</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/SubjectName</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">chr</Format>
|
||||
</Meta>
|
||||
<Data>CN=$FLEET_VAR_HOST_UUID managementAttestation</Data>
|
||||
<Data>CN=$FLEET_VAR_HOST_HARDWARE_SERIAL managementAttestation</Data>
|
||||
</Item>
|
||||
</Add>
|
||||
<Add>
|
||||
<!-- Extended Key Usage - keep default for Okta -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/EKUMapping</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/EKUMapping</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">chr</Format>
|
||||
@@ -95,39 +95,47 @@
|
||||
</Item>
|
||||
</Add>
|
||||
<Add>
|
||||
<!-- SCEP Server URL -->
|
||||
<!-- SCEP Server URL - Fleet will replace this with your secret -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/ServerURL</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/ServerURL</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">chr</Format>
|
||||
</Meta>
|
||||
<Data>{{yourScepUrl}}</Data>
|
||||
<Data>$FLEET_SECRET_OKTA_SCEP_URL</Data>
|
||||
</Item>
|
||||
</Add>
|
||||
<Add>
|
||||
<!-- SCEP Challenge - Does not need to be b64 -->
|
||||
<!-- SCEP Challenge - Fleet will replace this with your secret -->
|
||||
<!-- Best practice is not to include special characters. Underscores will break deployment. SCEP: Certificate enroll failed. Result: (The string contains a non-printable character.) -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/Challenge</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/Challenge</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">chr</Format>
|
||||
</Meta>
|
||||
<Data>{{yourScepChallenge}}</Data>
|
||||
<Data>$FLEET_SECRET_OKTA_SCEP_CHALLENGE</Data>
|
||||
</Item>
|
||||
</Add>
|
||||
<Add>
|
||||
<!-- SCEP CA Thumbprint (SHA-256) - Download Okta CA (if using) and specify thumbprint here -->
|
||||
<!-- SCEP CA Thumbprint (SHA-256) - Fleet will replace this with your secret -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/{{yourCertName}}/Install/CAThumbprint</LocURI>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/CAThumbprint</LocURI>
|
||||
</Target>
|
||||
<Meta>
|
||||
<Format xmlns="syncml:metinf">chr</Format>
|
||||
</Meta>
|
||||
<Data>{{yourScepCAThumbprint}}</Data>
|
||||
<Data>$FLEET_SECRET_OKTA_CA_THUMBPRINT</Data>
|
||||
</Item>
|
||||
</Add>
|
||||
</Add>
|
||||
<Exec>
|
||||
<!-- Trigger SCEP enrollment - Fleet automatically uses the correct certificate ID -->
|
||||
<Item>
|
||||
<Target>
|
||||
<LocURI>./User/Vendor/MSFT/ClientCertificateInstall/SCEP/$FLEET_VAR_SCEP_WINDOWS_CERTIFICATE_ID/Install/Enroll</LocURI>
|
||||
</Target>
|
||||
</Item>
|
||||
</Exec>
|
||||
|
||||
Reference in New Issue
Block a user