+
+ Apple does not expose device attestation to user-space software, for privacy reasons.
+ Hardware attestation on Apple platforms is limited to the Managed Device Attestation workflow, which requires a supervised, MDM-managed device.
+
+
+
+Because support is uneven, a credential can ask for hardware protection *with fallback*:
+the agent uses the strongest level the environment supports.
+For example, Apple platforms offer device-attested keys for Wi-Fi, while Windows has no native ACME device attestation, so a Windows Wi-Fi credential issued through the agent is hardware bound but attested by a different route.
+The Devices list reports the assurance the device reached, not the level you asked for.
+
+## Bring-your-own devices
+
+A personal device used for work raises a privacy problem:
+its permanent hardware identifiers should not be exposed to the employer.
+Continuity is enough.
+A cryptographically secure software identifier, scoped to your organization, can anchor policy and authentication for that device from then on.
+What it cannot do is bootstrap trust:
+the owner has to prove possession before the identity is trusted, because there is no manufacturer chain to lean on.
+
+## Where this shows up in Smallstep
+
+- The **Devices** list shows *high* or *normal* assurance per device.
+ [Inventory](../platform/concepts/inventory.mdx) describes the enrollment states around it.
+- A credential's key protection (`HARDWARE_ATTESTED` or `HARDWARE_WITH_FALLBACK` in the API) picks the level; see [Credentials](../platform/concepts/credentials.mdx) and the credential step of the [Wi-Fi guide](../tutorials/protect-wireless-networks.mdx#create-the-credential).
+- An MDM-managed Apple device can enroll with ACME device attestation and no agent; the [Wi-Fi guide](../tutorials/protect-wireless-networks.mdx#macos-with-jamf-pro-acme-device-attestation) shows it with Jamf Pro.
+- [Why device identity](./why-device-identity.mdx) makes the case; [SCEP versus attestation](./scep-versus-attestation.mdx) compares this with the enrollment most MDMs still use.
diff --git a/learn/certificates-for-people-devices-and-workloads.mdx b/learn/certificates-for-people-devices-and-workloads.mdx
new file mode 100644
index 00000000..32ca8a27
--- /dev/null
+++ b/learn/certificates-for-people-devices-and-workloads.mdx
@@ -0,0 +1,87 @@
+---
+updated_at: September 13, 2026
+title: Certificates for people, devices, and workloads
+html_title: Certificates for people, devices, and workloads
+description: The three kinds of subject a certificate can name, what each one proves, how each is issued, and how they combine.
+kind: learn
+---
+
+A certificate binds a key to a name.
+Everything else depends on whose name it is.
+The platform issues certificates to three kinds of subject, and each one is proven differently, lives a different length of time, and answers a different question at the verifier.
+
+## Devices
+
+A device certificate says: this is the laptop, phone, server, or instance we enrolled.
+The proof is hardware.
+The device attests, through its TPM or Secure Enclave, that the private key was generated inside it, and an authority signs only after verifying that attestation.
+[Attestation explained](./attestation-explained.mdx) covers the mechanism.
+
+A device certificate is what a Wi-Fi network, a wired switch, a VPN, or a browser presents.
+It is delivered and renewed by the Smallstep agent, or by an MDM profile where the agent is not present.
+It carries the device's identity, usually its serial number and the email of the user bound to it, so a verifier can decide by device, by user, or by both.
+
+The question it answers: *is this a device we trust?*
+
+## People
+
+A user certificate says: this is the person who just signed in.
+The proof is your identity provider.
+The person authenticates with single sign-on; the identity provider returns an OpenID Connect token; the authority verifies the token and issues a certificate whose subject is the person's email.
+No password is stored or shared anywhere in the exchange.
+
+User certificates are short-lived by design.
+An SSH user certificate lasts 16 hours by default, so each workday starts with a fresh sign-in and access ends without anyone revoking anything.
+X.509 user certificates for mutual TLS to APIs, databases, or a proxy follow the same shape.
+Renewal is off for these on purpose: re-authenticating with the identity provider is the point.
+
+The question it answers: *is this the person they say they are, right now?*
+
+For SSH specifically, the certificate also carries the person's principals, the account names they may log in as, and, with the GitHub integration, their GitHub username.
+[How SSH certificates work](../ssh/how-it-works.mdx) walks the login.
+
+## Workloads
+
+A workload certificate says: this is the nginx, the PostgreSQL, the `sshd`, the Kubernetes ingress running on that host.
+The proof depends on where the workload runs.
+On a host with the agent, the agent's device identity vouches for the workload it manages.
+On a cloud instance, the instance identity document from AWS, GCP, or Azure does.
+In Kubernetes, a service account token does.
+For anything that speaks ACME, control of a DNS name does.
+
+A workload certificate is a server or client certificate for TLS between services.
+It is renewed automatically, by the agent, by an ACME client, or by `step ca renew`, and it is usually short-lived because nobody has to type anything to renew it.
+
+The question it answers: *is this the service that should be on this connection?*
+
+## Side by side
+
+| | Device | Person | Workload |
+|---|---|---|---|
+| Proven by | Hardware attestation | Your identity provider | The host's identity, the cloud, Kubernetes, or DNS |
+| Typical lifetime | Hours to days, renewed by the agent | Hours, renewed by signing in again | Hours to days, renewed automatically |
+| Delivered by | Agent or MDM profile | `step ssh login` or the agent | Agent, ACME client, or `step` |
+| Presented to | RADIUS, VPN, identity provider, web app | SSH host, API, proxy | Another service |
+| Kind | X.509 | SSH or X.509 | X.509 or SSH host |
+
+## How they combine
+
+The strongest policy names both a person and a device.
+
+At sign-in, an identity provider can require a device certificate before it issues the person a session.
+The session is then a bearer token, which the device certificate cannot follow, so the device is proven at login and the token is what reaches the app.
+That is the pattern behind the SSO device factor.
+
+For SSH, an SSH user certificate can be issued through the agent on an enrolled device rather than through a browser login, so the certificate is bound to hardware as well as to a person.
+Today the two are separate ways of getting an SSH user certificate; issuing one certificate with both proofs at once, the sign-in and the attestation, is planned and not yet available.
+
+For workloads, the host's device identity is what authorizes the workload's certificate, which is why a server enrolled with the agent can get its nginx certificate with nothing configured on the server but the agent.
+
+## Where this shows up in Smallstep
+
+- All three are **credentials**, defined by a template, an issuance method, and an assignment policy: [Credentials](../platform/concepts/credentials.mdx).
+- Devices and the users bound to them are the [Inventory](../platform/concepts/inventory.mdx); a host is a device with a workload configured on it.
+- Device certificates: the [Wi-Fi](../tutorials/protect-wireless-networks.mdx), [wired](../tutorials/protect-wired-networks.mdx), [VPN](../tutorials/vpn-setup-guide.mdx), and [web app](../tutorials/browser-certificate-setup-guide.mdx) guides.
+- Person certificates: the [SSH client quickstart](../ssh/client.mdx) and [single sign-on certificates](../certificate-manager/oidc.mdx) for X.509.
+- Workload certificates: [Kubernetes TLS](../certificate-manager/kubernetes-tls/README.mdx) and, for a cloud instance, [X.509 certificates for cloud VMs](../tutorials/cloud-vm-certificate.mdx).
+- The open-source [provisioners](../step-ca/provisioners.mdx) page documents each issuance mechanism underneath.
diff --git a/learn/how-smallstep-hosts-step-ca.mdx b/learn/how-smallstep-hosts-step-ca.mdx
index 62653c44..39136da7 100644
--- a/learn/how-smallstep-hosts-step-ca.mdx
+++ b/learn/how-smallstep-hosts-step-ca.mdx
@@ -2,7 +2,89 @@
updated_at: September 13, 2026
title: How Smallstep hosts step-ca
html_title: How Smallstep hosts step-ca
-description: What a hosted authority shares with open-source step-ca, what the platform adds, and which page to read for each job.
+description: What a hosted authority shares with open-source step-ca, what the platform adds around it, what is different, and which page to read for each job.
+kind: boundary
---
-A hosted authority is a step-ca. This page will say what is the same (provisioner types, which the platform calls issuance methods; templates; ACME; issuance policies; webhooks), what the platform adds (an inventory, hardware-attested issuance, credentials, verifiers, policy modes, audit), and which page to read for each job. Until it lands, the open-source [step-ca documentation](../step-ca/README.mdx) describes the shared mechanics.
+A hosted Smallstep authority is a `step-ca`.
+The open-source documentation on this site describes how that certificate authority works, and this documentation does not repeat it.
+This page is the seam:
+what is the same and documented once on the open-source side, what the platform builds around the authority, where the two differ, and which page to open for each job.
+
+## What is shared
+
+Everything below works the same way on a hosted authority as on a `step-ca` you run, and is documented on the open-source page linked.
+
+- **Provisioners**, the mechanisms by which a requester proves it may have a certificate.
+ The platform calls them *issuance methods* and shows the raw provisioner under Advanced and in the API.
+ The types and their options are on [Provisioners](../step-ca/provisioners.mdx).
+- **Templates**, which set the fields and extensions of an issued certificate: [Templates](../step-ca/templates.mdx).
+- **ACME**, including the `http-01`, `dns-01`, `tls-alpn-01`, and `device-attest-01` challenges: [ACME basics](../step-ca/acme-basics.mdx).
+- **Issuance policies**, the allow and deny rules over the names an authority will sign: [Policies](../step-ca/policies.mdx).
+- **Webhooks** called during signing to enrich or authorize a request: [Webhooks](../step-ca/webhooks.mdx).
+- **Renewal** semantics, including renewal with the existing certificate and the daemon mode: [Renewal](../step-ca/renewal.mdx).
+- **Revocation**, passive and active: [Revocation](../step-ca/revocation.mdx).
+- **The `step` CLI**, which talks to any `step-ca`, hosted or self-run, and is used throughout the platform guides: [step CLI](../step-cli/README.mdx).
+
+## What the platform adds
+
+The authority is one piece.
+Around it the platform runs the surfaces that [How Smallstep works](../start-here/how-smallstep-works.mdx) describes:
+
+- **An inventory** of devices and users, so a certificate is issued *to a device you enrolled* rather than to whoever presented a valid token.
+ [Inventory](../platform/concepts/inventory.mdx).
+- **Hardware-attested issuance.**
+ Each team has an attestation authority that verifies TPM and Secure Enclave attestations, and the agent completes ACME `device-attest-01` against it on platforms without native support.
+ [Attestation explained](./attestation-explained.mdx).
+- **Credentials** as the unit of configuration: a template, an issuance method, and an assignment policy that says which devices and users get the certificate.
+ You configure a credential; the platform configures the provisioner.
+ [Credentials](../platform/concepts/credentials.mdx).
+- **Verifiers that Smallstep runs**, RADIUS for Wi-Fi and wired networks, the device factor for identity providers, relays, and the trust roots they need from your authorities.
+ [Verifiers](../platform/concepts/verifiers.mdx).
+- **Delivery.**
+ The agent enrolls, renews, stores keys in hardware, and reloads services; MDM profiles do it for devices without the agent; the step-ssh package does it for SSH hosts.
+- **Policy** beyond issuance: which devices get which credential, who may log in where, what happens when a device is quarantined.
+ [Policy](../platform/concepts/policy.mdx).
+- **Audit**: events for every issuance and authentication, SSH sessions, webhooks to your systems.
+ [Audit](../platform/concepts/audit.mdx).
+
+## What is different
+
+Where an operator who knows `step-ca` will notice a divergence:
+
+- **Policy scope.**
+ A self-run `step-ca` takes an issuance policy at the authority level.
+ A hosted authority takes one at the authority, on each provisioner, and on each ACME account.
+- **Administration.**
+ There is no `ca.json` to edit.
+ Provisioners, admins, and templates are managed in the Console and the API; `step ca provisioner` commands also work against a hosted authority after an admin sign-in.
+- **Key custody.**
+ Signing keys are held in a cloud key management service and never leave it; an Advanced authority can be created with your own root, and the root's private key stays with you.
+ [Bring your own root](../certificate-manager/byo-root.mdx).
+- **Renewal after expiry and active revocation** (CRL and OCSP) are options of an Advanced authority, enabled when it is created.
+- **Linked authorities.**
+ A `step-ca` you run can be linked to the platform.
+ Its keys and signing stay on your infrastructure; the platform manages its provisioners and admins.
+ It is listed with your hosted authorities.
+- **A registration authority** in front of a hosted authority is a platform object; the `step-ca` RA mode that fronts your own CA is documented at [Registration authority mode](../step-ca/registration-authority-ra-mode.mdx).
+
+## Which page?
+
+| I want to | Hosted authority | Self-run step-ca |
+|---|---|---|
+| Configure ACME for my servers | [ACME on a hosted authority](../certificate-manager/acme/README.mdx) | [ACME basics](../step-ca/acme-basics.mdx) |
+| Write a certificate template | [Templates for credentials](../certificate-manager/custom-certs.mdx) | [Templates](../step-ca/templates.mdx) |
+| Set an issuance policy | [Policies](../step-ca/policies.mdx), which covers both | same |
+| Receive webhooks | [Webhook events](../certificate-manager/webhook-events.mdx) for platform events; [Webhooks](../step-ca/webhooks.mdx) for signing-time hooks | [Webhooks](../step-ca/webhooks.mdx) |
+| Renew certificates | The agent, or [Issue certificates with your own clients](../certificate-manager/basic-ops.mdx) | [Renewal](../step-ca/renewal.mdx) |
+| Revoke a certificate | [Issue certificates with your own clients](../certificate-manager/basic-ops.mdx) | [Revocation](../step-ca/revocation.mdx) |
+| Run a registration authority | [Registration authorities](../registration-authorities/README.mdx) | [Registration authority mode](../step-ca/registration-authority-ra-mode.mdx) |
+| Bring my own root | [Bring your own root](../certificate-manager/byo-root.mdx) | [Import an existing root or intermediate](../tutorials/intermediate-ca-new-ca.mdx) |
+| Issue certificates to people with single sign-on | [Single sign-on certificates](../certificate-manager/oidc.mdx) | [OAuth/OIDC provisioner](../step-ca/provisioners.mdx#oauthoidc-single-sign-on) |
+| Use `step` against my authority | [Issue certificates with your own clients](../certificate-manager/basic-ops.mdx) | [Basic certificate authority operations](../step-ca/basic-certificate-authority-operations.mdx) |
+
+## Running your own
+
+Run `step-ca` yourself when the signing keys must stay on hardware you own, when the authority must work without a connection to the internet, when you are building a lab, or when a certificate authority is all you need and an inventory, verifiers, and audit would be weight.
+Everything you need is in the open-source section, starting at [step-ca](../step-ca/README.mdx).
+If you later want the platform around it, link it as an authority and the rest of this documentation applies.
diff --git a/learn/pki-in-one-page.mdx b/learn/pki-in-one-page.mdx
new file mode 100644
index 00000000..4c62a3ab
--- /dev/null
+++ b/learn/pki-in-one-page.mdx
@@ -0,0 +1,95 @@
+---
+updated_at: September 13, 2026
+title: PKI in one page
+html_title: PKI in one page
+description: Certificates, keys, authorities, chains, issuance, renewal, and revocation, in the order you meet them.
+kind: learn
+---
+
+Public key infrastructure is the set of things that lets a stranger check a claim without a shared secret.
+This page defines the seven words you will meet on every other page, in the order they depend on each other.
+For the full treatment, read [Everything you should know about certificates and PKI](https://smallstep.com/blog/everything-pki/).
+
+## Keys
+
+Everything starts with a key pair.
+The **private key** signs and decrypts; the **public key** verifies and encrypts.
+Anyone may hold the public key.
+Whoever holds the private key *is*, for every practical purpose, the identity.
+That is why where the private key lives matters more than anything else on this page:
+a key on disk can be copied, a key in a secure element cannot.
+[Attestation explained](./attestation-explained.mdx) covers the levels.
+
+## Certificates
+
+A **certificate** is a signed statement that binds a public key to a name.
+For X.509, the format used by TLS, the names are a subject and a list of subject alternative names: DNS names, IP addresses, email addresses, URIs.
+For SSH, the names are principals.
+A certificate also says what the key may be used for (server authentication, client authentication), when it becomes valid, and when it expires.
+
+A certificate proves nothing by itself.
+It is a claim, and the signature on it is what makes the claim checkable.
+
+## Authorities
+
+A **certificate authority** is the party that signs certificates.
+It holds a private key of its own and a certificate for the matching public key.
+When a verifier trusts an authority, it accepts every certificate that authority signed, within the constraints the certificate carries.
+
+Authorities come in two roles.
+A **root** signs only other authorities' certificates and is kept as far from the network as possible.
+An **intermediate** is signed by the root and does the daily work of issuing certificates to devices, people, and workloads.
+The indirection is what lets you rotate or retire an intermediate without touching every trust store.
+
+## Chains
+
+A verifier does not know your intermediate; it knows your root, because the root is what was installed in its trust store.
+A presented certificate therefore has to arrive with the intermediate's certificate too, and the verifier walks the **chain**:
+leaf signed by intermediate, intermediate signed by root, root in the trust store.
+One missing link and the handshake fails with an error that looks like a bad certificate.
+[Trust roots and chains](./trust-roots-and-chains.mdx) is about that failure and how to avoid it.
+
+## Issuance
+
+**Issuance** is how a requester proves to an authority that it is entitled to a certificate for a name.
+The proof is the whole security of the system: sign for the wrong requester and the authority has minted an identity for an attacker.
+
+Methods differ by who the requester is.
+A web server proves control of a DNS name (ACME).
+A person proves who they are by signing in to the identity provider (OIDC).
+A cloud instance presents its instance identity document.
+A device presents a hardware attestation.
+On a Smallstep authority these are *issuance methods*; the open-source `step-ca` calls them [provisioners](../step-ca/provisioners.mdx), and the mechanics are documented there.
+
+Issuance also decides what goes in the certificate.
+A **template** sets the fields and extensions; an **issuance policy** sets what names an authority will and will not sign.
+
+## Renewal
+
+Certificates expire, on purpose.
+A short lifetime bounds the damage from a key that leaks and keeps the fleet honest about which systems can still reach the authority.
+**Renewal** replaces a certificate before it expires, authenticated by the certificate being renewed.
+Automating it is the difference between a PKI that works and one that causes the outage everyone remembers.
+On the platform, the agent renews device credentials; for anything else, `step ca renew` and ACME clients do it.
+
+## Revocation
+
+Sometimes a certificate must stop working before it expires:
+the device was lost, the person left, the key leaked.
+There are two ways.
+
+**Passive revocation** refuses to renew.
+The certificate keeps working until it expires, so it depends on short lifetimes to be useful.
+It is simple and it always works.
+
+**Active revocation** publishes a list (a CRL) or answers queries (OCSP) so verifiers can reject a certificate immediately.
+It is what incident response wants, and it is only as good as the verifiers that check it.
+Many do not, or cache the answer.
+For systems that support it, revoking *authorization* (removing the device from the inventory, the user from the group) is often faster and more reliable than revoking the certificate.
+
+## Where this shows up in Smallstep
+
+- Your authorities, their roots and intermediates, and the certificates they have issued are under [Trust](../platform/concepts/trust.mdx).
+- Templates, issuance methods, and lifetimes are set on a [credential](../platform/concepts/credentials.mdx).
+- Renewal and revocation for device credentials are the agent's job; for certificates you issue with your own clients, see [Issue certificates with your own clients](../certificate-manager/basic-ops.mdx).
+- The open-source [certificate authority core concepts](../step-ca/certificate-authority-core-concepts.mdx) page defines the same terms from the point of view of running `step-ca` yourself.
diff --git a/learn/radsec.mdx b/learn/radsec.mdx
new file mode 100644
index 00000000..11d83666
--- /dev/null
+++ b/learn/radsec.mdx
@@ -0,0 +1,74 @@
+---
+updated_at: September 13, 2026
+title: RadSec
+html_title: RadSec (RADIUS over TLS)
+description: What RADIUS over TLS is, why it exists, when you want it, and what the platform supports today.
+kind: learn
+---
+
+RADIUS was designed for a network access server talking to an authentication server down the hall.
+Today the access point is in your office and the RADIUS server is in a cloud region, and the protocol is carrying your fleet's Wi-Fi authentications across the internet.
+RadSec is how you make that safe.
+
+## What RADIUS does in a certificate-based network
+
+In an 802.1X network, the access point or switch does not verify the device's certificate itself.
+It relays the EAP-TLS handshake to a RADIUS server, which completes the TLS handshake with the device, checks the certificate against the trust roots it was given, and answers Access-Accept or Access-Reject.
+The access point only opens the port when it hears Accept.
+
+The device's certificate and keys are protected by that inner TLS handshake.
+Everything around it is plain RADIUS.
+
+## What plain RADIUS lacks
+
+Classic RADIUS runs over UDP and secures itself with a shared secret and MD5.
+That was adequate on a LAN in 1997.
+Over the internet it means:
+
+- **Attributes travel in the clear.**
+ The EAP payload is encrypted by TLS, but the RADIUS attributes around it, including the device's identity, the access point's identity, and any VLAN assignment coming back, are not.
+- **A shared secret is the only authentication**, and it is shared by every access point that talks to the server.
+- **The server identifies the client by source IP.**
+ A cloud RADIUS service has to know the public IP of every site that will send it traffic, and a change of ISP or a new office means updating that list before anyone can join the network.
+- **UDP across the internet drops and reorders**, and RADIUS has no session to recover in; the client retries and the user waits.
+
+## What RadSec changes
+
+RadSec ([RFC 6614](https://datatracker.ietf.org/doc/html/rfc6614)) is RADIUS over TLS, on TCP port 2083.
+The access point or controller opens a TLS connection to the RADIUS server, both sides present certificates, and every RADIUS packet flows inside that tunnel.
+
+- Attributes are encrypted end to end between the access point and the server.
+- The server authenticates the access point by its certificate, not by its source IP, so sites can move and NAT can change without a registration step.
+- The access point authenticates the server by its certificate, so an impostor RADIUS server cannot harvest handshakes.
+- TCP gives ordered, reliable delivery and a long-lived connection instead of a fresh UDP exchange per authentication.
+
+The shared secret still exists in RadSec for protocol compatibility, but it is fixed and no longer carries the security.
+
+## When you want it
+
+RadSec is the right choice when the path between your access points and the RADIUS server crosses a network you do not control, which is every cloud-hosted RADIUS deployment.
+It also removes the operational chore of keeping a list of public IPs current across offices and internet providers.
+
+The cost is that the access point or controller has to support it, has to be given the RADIUS server's CA so it can verify the server, and has to hold a client certificate the server will accept.
+Not every access point does; most enterprise controllers do.
+Check your vendor's documentation before planning on it.
+
+## What the platform supports today
+
+Smallstep RADIUS is offered in two forms, and the [Wi-Fi guide](../tutorials/protect-wireless-networks.mdx#step-2-configure-the-enforcement-point) documents both.
+
+- The multi-tenant service (**Managed RADIUS** in the guide) speaks RADIUS over UDP.
+ It attributes traffic to your team by the public IP addresses you register, which is the `nasIPs` list you set when you create the server.
+ You can create it yourself with the API.
+- The dedicated deployment (**Enterprise RADIUS** in the guide) adds **RadSec transport with a dedicated hostname**, beside standard RADIUS over UDP, on infrastructure with static IPs in the regions you choose.
+ It also adds reply attributes for VLAN assignment and authorization webhooks.
+ Smallstep provisions it for your team; it is an add-on rather than something you create in the Console today.
+
+Both forms verify EAP-TLS only and check the full chain and revocation on every authentication.
+The [wired guide](../tutorials/protect-wired-networks.mdx) uses the same servers for 802.1X on switches.
+
+## Where this shows up in Smallstep
+
+- The RADIUS server is the verifier for [Wi-Fi](../tutorials/protect-wireless-networks.mdx) and [wired](../tutorials/protect-wired-networks.mdx) networks; [Verifiers](../platform/concepts/verifiers.mdx) describes it beside the others.
+- The trust roots the RADIUS server needs, and the server CA your devices need, are the subject of [Trust roots and chains](./trust-roots-and-chains.mdx).
+- The per-vendor [access point reference](../tutorials/protect-wireless-networks.mdx#access-point-configuration-reference) shows where each vendor takes the RADIUS server settings.
diff --git a/learn/scep-versus-attestation.mdx b/learn/scep-versus-attestation.mdx
new file mode 100644
index 00000000..571d247e
--- /dev/null
+++ b/learn/scep-versus-attestation.mdx
@@ -0,0 +1,89 @@
+---
+updated_at: September 13, 2026
+title: SCEP versus attestation
+html_title: SCEP versus attestation
+description: What SCEP proves and does not prove, why attestation closes the gap, and what SCEP is still the right tool for.
+kind: learn
+---
+
+SCEP is how most MDM platforms get certificates onto devices, and it has done that job for two decades.
+It also has a hole in the middle that attestation was designed to fill.
+This page describes both honestly, because you will probably use both.
+
+## How SCEP enrollment works
+
+The Simple Certificate Enrollment Protocol ([RFC 8894](https://datatracker.ietf.org/doc/html/rfc8894)) is a request-and-response exchange between a device and a certificate authority.
+In an MDM deployment:
+
+1. An employee enrolls their device with the MDM, usually by signing in.
+2. The MDM sends the device a SCEP payload: a server URL, the fields the certificate should carry, and a challenge password.
+3. The device generates a key pair and sends a signing request with the challenge to the SCEP server.
+4. The server checks the challenge and returns a signed certificate.
+
+The device now has a certificate it can use for Wi-Fi, VPN, or anything else the MDM configured.
+
+## What SCEP does not prove
+
+Look at step 3.
+The device sends a signing request and a password.
+Nothing in the exchange is evidence about the device itself.
+The authority cannot tell whether the request came from the laptop the MDM enrolled, from a virtual machine, or from a script on an attacker's desk that happens to hold the payload.
+There is no known identity for the device at the moment it first identifies itself.
+
+The challenge password is the whole gate, and passwords travel.
+If a phishing page captures the user's MDM sign-in, the attacker can enroll a device the organization never approved.
+If a configuration profile leaks, anyone who reads it can request a certificate and impersonate the user it was meant for.
+The private key, meanwhile, was generated by software and may sit on disk, where it can be copied.
+
+SCEP comes in two flavors and only one is acceptable:
+
+- **Static SCEP** puts the same challenge password in every payload for every device.
+ One leak compromises the whole fleet, and every device looks like one user in reporting.
+ Smallstep does not support it.
+- **Dynamic SCEP** uses a webhook to mint a unique challenge per device, so each enrollment is distinct and reportable.
+ Jamf Pro, Intune, Workspace ONE, Mosyle, Ivanti, and Google Workspace support it, and this is what the platform integrates with.
+
+Dynamic SCEP fixes the shared-secret problem.
+It does not fix the evidence problem.
+
+## What attestation adds
+
+With attestation, the device does not merely present a password; it presents a signed statement from its secure element, chained to the manufacturer, that says which device this is and that the private key was generated inside that hardware.
+The authority verifies the statement before signing.
+The gate is now "is this hardware one we enrolled", which a phishing page cannot satisfy and a leaked profile cannot replay.
+
+The standard form is ACME with the `device-attest-01` challenge.
+Apple and ChromeOS support it natively for managed devices; on Windows and Linux the Smallstep agent performs the attestation with the TPM.
+[Attestation explained](./attestation-explained.mdx) describes the levels in detail.
+
+| | Dynamic SCEP | ACME device attestation |
+|---|---|---|
+| What gates issuance | A per-device challenge password | A manufacturer-signed statement about the hardware |
+| Where the key lives | Software, unless the MDM and OS bind it to hardware | The secure element; not exportable |
+| Survives a phished MDM login | No | Yes |
+| Survives a leaked profile | No | Yes |
+| Ties the certificate to an inventory record | By what the MDM says | By what the hardware proves |
+| Needs an agent | No | Only on platforms without native support |
+
+## What SCEP is still good for
+
+SCEP is not going away, and on the platform it has two honest jobs.
+
+**Devices that cannot attest through the platform.**
+Most MDMs have not adopted ACME device attestation, and some platforms cannot run the agent.
+For an MDM-managed device without the agent, a dynamic SCEP certificate issued by your hosted authority is still a large improvement over a shared password on the Wi-Fi, and the device appears in your inventory with *normal* assurance rather than *high*.
+The [Wi-Fi guide](../tutorials/protect-wireless-networks.mdx#mdm-managed-clients) shows this with Jamf Pro and Intune.
+
+**Bootstrapping the agent.**
+The agent needs a provisional identity to open its first authenticated channel to the platform.
+A SCEP certificate delivered by the MDM is a good one: it proves the device is in the MDM's inventory, which is enough to begin the attestation that produces the real, hardware-bound identity.
+After that, the SCEP certificate has done its job.
+
+SCEP is also how the platform stands in for Active Directory Certificate Services during a migration, since it speaks SCEP and NDES to the workloads that still expect them.
+
+## Where this shows up in Smallstep
+
+- SCEP is configured when you connect an MDM; see [Jamf Pro](../tutorials/connect-jamf-pro-to-smallstep.mdx), [Intune](../tutorials/connect-intune-to-smallstep.mdx), [Mosyle](../tutorials/connect-mosyle-to-smallstep.mdx), and [Workspace ONE](../tutorials/connect-workspace-one-to-smallstep.mdx).
+- The **Devices** list shows *normal* assurance for a SCEP-only device and *high* for one that attested; [Inventory](../platform/concepts/inventory.mdx) explains.
+- A credential's issuance method is where the choice lives; see [Credentials](../platform/concepts/credentials.mdx).
+- The open-source [SCEP provisioner](../step-ca/provisioners.mdx#scep) is the mechanism underneath a hosted authority's SCEP support.
diff --git a/learn/trust-roots-and-chains.mdx b/learn/trust-roots-and-chains.mdx
new file mode 100644
index 00000000..430a04a2
--- /dev/null
+++ b/learn/trust-roots-and-chains.mdx
@@ -0,0 +1,93 @@
+---
+updated_at: September 13, 2026
+title: Trust roots and chains
+html_title: Trust roots and chains
+description: Why a verifier needs the whole chain, what roots and intermediates each do, and what "trust roots" means on the platform.
+kind: learn
+---
+
+The most common reason a certificate-based setup fails on the first try is not the certificate.
+It is that the thing checking the certificate was never told whom to trust, or was told half of it.
+This page is about that half.
+
+## A verifier only knows what it was given
+
+When a device presents a certificate, the verifier, whether a RADIUS server, an identity provider, an SSH daemon, or a web server, has one question:
+was this signed by an authority I trust?
+It answers by looking in its own trust store.
+Whatever is in that store is the whole universe of authorities the verifier will accept.
+A certificate from anyone else is rejected with an error that usually blames the certificate.
+
+Every use case therefore has a step that is easy to skip:
+put your authority's trust roots where the verifier will look.
+The [Wi-Fi guide](../tutorials/protect-wireless-networks.mdx) does it when it registers your client CA with the RADIUS server; the [SSH guide](../ssh/hosts.mdx) does it when it points `sshd` at the user CA; a web app does it in its server configuration.
+
+## Roots and intermediates
+
+An authority is usually two certificates, not one.
+
+The **root** is self-signed and long-lived.
+Its private key signs only the intermediate's certificate and is otherwise kept out of reach.
+The root is what goes into trust stores, because it changes rarely.
+
+The **intermediate** is signed by the root and does the daily signing of device, user, and workload certificates.
+It can be rotated, replaced, or revoked without touching a single trust store, as long as the new one is signed by the same root.
+
+A hosted Smallstep authority is built this way, and so is a [`step-ca`](../step-ca/certificate-authority-core-concepts.mdx) you run yourself.
+Bringing your own root keeps the same shape:
+your existing root signs a Smallstep intermediate, and everything that already trusts your root trusts what the intermediate issues.
+
+## The chain
+
+A verifier that trusts the root has never seen the intermediate.
+The presenter must therefore send both its own certificate and the intermediate's certificate, and the verifier walks the chain:
+
+```mermaid
+flowchart LR
+ leaf["Device certificate