Troubleshoot Device Trust
Find the symptom below and work through its checks. Most Device Trust problems come from certificate provisioning rather than from Firezone, so the fix usually belongs in your MDM or CA.
Start with the Client
Open Settings → Device Trust in the Firezone Client. It reports the four
things that have to be true, and it tells you which one is failing:
- A certificate was found and selected.
- Its chain validates against your trust anchors.
- Its private key is usable for signing.
- Its device identifiers are the values you expect.
Read that screen before changing anything. It distinguishes between problems that look identical from the portal side.
If the screen is unavailable or the Client will not start, collect diagnostic logs.
The Client finds no certificate
The Client selects an identity by its subject, which must be exactly
CN=dev.firezone.device-trust.
- Confirm the profile is assigned to the test device's group and that the device has synced. Check the certificate is installed on the device itself, not just that the profile exists.
- Check the subject on the issued certificate. A CA template that rewrites or appends to the subject produces a certificate the Client will not select.
- macOS and Apple platforms: the certificate payload and the VPN payload
must be in the same profile, and the VPN payload must reference the
certificate payload's
PayloadUUID. Deploy through the Device channel withPayloadScopeset toSystem. - Android: the certificate and the Firezone app must be installed in the same profile. An identity in the personal profile is invisible to an app in the work profile.
- Linux: confirm the Client is configured with the PKCS#11 provider and identity holding the certificate.
The certificate is found but the chain is not valid
Firezone builds the chain from the leaf the Client presents up to a configured trust anchor.
- Add every intermediate CA as well as the root under
Settings → Trust Anchors. A missing intermediate is the most common cause. - Confirm the anchors were added to the account the Client signs in to. A trust anchor applies to one Firezone account.
- Confirm the uploaded CA certificate is the one that actually issued the leaf. Cloud PKI and similar services can host several issuing CAs.
The private key cannot be used for signing
The certificate is present and valid, but the Client cannot produce a signature. This is an access-control problem, and on Apple platforms it is almost always decided when the key is created.
- Windows: the tunnel service runs as
LocalSystem. Verify thatSYSTEMcan use the CNG private key, and that the identity is inLocalMachine\Myrather than a user store. - macOS: the SCEP payload must have
AllowAllAppsAccess=trueat the time the key is created. The Firezone system extension cannot display a Keychain authorization prompt, so a key that requires one fails silently. - Android: the MDM must grant Firezone access to the key. On corporate devices set the managed keychain alias; on personally owned devices the user selects the certificate when prompted.
- Linux: confirm the PKCS#11 provider is reachable and that the token is unlocked.
On macOS, changing AllowAllAppsAccess in the profile afterwards does not
repair an existing key's access control. Reissue the identity.
The device identifier is wrong or empty
The Client shows the URI SANs it read from the certificate.
- A literal
{{DeviceId}},$DEVICE_ID, or$SERIAL_NUMBERmeans the variable was not substituted. Inspect the issued certificate rather than the profile: the profile can be correct while the CA drops or ignores the requested SANs. - Confirm the CA template is configured to issue the SANs supplied in the request. Many templates discard them by default.
- Confirm each identifier is a real per-device value. Empty, placeholder, and shared values are not valid identifiers.
- Personally owned Android work profiles: Android 12 and later restrict
hardware serial numbers, which can fail provisioning. Omit
firezone://serial/<serial-number>and keep the MDM inventory ID.
See device identifiers for the supported claims.
The Client connects but is not attested
An expired certificate, or one whose private key has become inaccessible, does not fail the connection. The Client connects without attestation, so Resources behind an attestation condition stop being reachable while everything else keeps working.
- Check the certificate's validity period and whether renewal is still running.
- Work through the private key checks above.
- On platforms where the MDM or the user selects the identity, confirm the selection still points at a current certificate.
The Client is attested but access is still denied
Attestation succeeded, so the problem is in the Policy.
- Confirm the Policy granting access to that Resource carries the Require attestation condition.
- The condition is evaluated on the current connection. A Client that reconnected without its certificate does not keep an earlier attested state. Reconnect and re-check.
An unattested device can still reach the Resource
Policies are additive, so any Policy that grants access is sufficient on its own.
- Find every Policy that grants the same Group access to that Resource and add the condition to each, or remove the ones that should not apply. One overlapping Policy without the condition defeats the others.
Access worked and then stopped
- The certificate expired or was renewed incorrectly. A renewal must preserve both the device identifier and the exact subject common name. Some automatic redistribution workflows alter the subject, which makes the Client stop selecting the identity.
- The certificate was revoked. Firezone checks CRL and OCSP endpoints in the background, disconnects Clients using a revoked certificate, and blocks reconnection with it.
- A newer certificate was installed. When several usable certificates are
present, the Client selects the one with the most recent
NotBefore. If that one is wrong, remove it rather than reordering.
Nothing above matches
Collect diagnostic logs, note what
Settings → Device Trust reports, and export the issued certificate so its
subject, SANs, extended key usage, and chain can be inspected directly.
Need help? See all support options.