Aller au contenu

EAP-TLS for domain users

EAP-TLS replaces the password with a certificate. There is no shared secret to phish, nothing to type, and nothing that expires the way a password does — the client proves possession of a private key, and Taranac decides who that key belongs to.

For directory users this is the method that actually fits. PEAP cannot authenticate an Active Directory account at all — it needs an NT hash that lives in the directory, not in Taranac. EAP-TTLS can, by binding to LDAP, but a password still crosses the tunnel. EAP-TLS removes the password from the picture entirely, which is why it is what most Windows domains standardise on.

This guide takes a domain-joined Windows PC and an Active Directory user, and gets the port authorized on a certificate.

Before anything else, decide where client certificates come from. Taranac supports both, they are not exclusive, and the choice does not change how policy or authentication works — only who issues and delivers the credential.

Internal PKI — Taranac issuesExternal CA — Taranac only trusts
Who signsTaranac’s built-in Certificate AuthorityYour existing issuer: AD CS, a corporate PKI, a partner’s CA
Delivery to the deviceDownload a PKCS#12, or email a one-time link; optional auto-issue on user creationHowever that CA already does it — for AD CS, autoenrollment by group policy
RevocationRevoke in Taranac; CRL published automaticallyHandled by the issuing CA, consumed by Taranac via CRL/OCSP
FitsBYOD, contractors, non-domain machines, printers and IoTDomain-joined fleets that already have a working PKI
Work per userOne issuance action (or automated)None — the domain does it

Both feed the same trust bundle, so you can run them side by side: domain laptops on AD CS certificates, everything else on certificates Taranac issued. Nothing downstream needs to know the difference.

This guide walks the AD CS path, because that is the realistic shape of a Windows domain. Where the internal-PKI path differs, it is called out inline.

Step 1 — Teach Taranac to trust the issuing CA

Section titled “Step 1 — Teach Taranac to trust the issuing CA”

A client certificate is accepted when it chains to a CA in Taranac’s client trust bundle. That bundle is assembled from three independent sources:

  1. Internal CAs — every enabled CA Taranac runs itself
  2. Trusted CAs — external CA certificates you upload (/nac/settings/trusted-cas)
  3. LDAP domains with EAP-TLS enabled — the CA attached to a directory

For a domain scenario, prefer the third. Open Settings → LDAP, select the domain, and in its EAP-TLS section enable EAP-TLS and paste the root CA of your AD CS (plus a CRL URL, if you intend to check revocation).

Attaching the CA to the domain rather than uploading it as a standalone Trusted CA is not just bookkeeping: the same section also carries which certificates that domain issues (user, computer, or both) and how a certificate maps to a user — the subject of Step 2. Trust and identity rules stay with the directory they belong to, instead of being scattered across two pages.

Use the Trusted CAs page instead when the CA has nothing to do with a directory — a partner’s issuer, or a CA for devices that have no user at all.

Step 2 — Decide how a certificate becomes a user

Section titled “Step 2 — Decide how a certificate becomes a user”

A certificate proves a key; it does not by itself say which account that is. Taranac reads an identity out of the certificate and looks it up among its users, in this order:

SAN UPN → SAN email → Subject CN → RADIUS User-Name

The first one that matches an account wins. If a UPN carries a domain suffix (alice@lab.example.com) and no account matches in full, Taranac retries with the bare username. On the LDAP domain you also set identity match explicitly — san_upn, san_email or cn — which is the field that population’s certificates are expected to carry. For AD CS with a standard user template, san_upn is the right answer and the default.

When no user matches, this is not necessarily an error: Taranac treats it as a machine certificate and evaluates policy with no user at all, matching on the endpoint’s groups instead. That is how domain computers authenticate before anyone logs in — see Machine authentication and SSO. This guide stays on user certificates.

On the CA, publish a certificate template for user certificates with:

  • Client Authentication in Extended Key Usage — without this EKU Windows will not offer the certificate to the supplicant at all
  • the user’s UPN in the Subject Alternative Name, which is what Step 2 matches on
  • no e-mail name in the subject or the SAN, unless every user in scope actually has a populated mail attribute — see below
  • Read, Enroll and Autoenroll for the group that should receive it

Then refresh policy and force an enrollment cycle, as the user, unelevated:

Terminal window
gpupdate /force
certutil -user -pulse

Verify the certificate arrived, and note where it landed:

Terminal window
Get-ChildItem Cert:\CurrentUser\My |
Select-Object Subject, EnhancedKeyUsageList, NotAfter

A user certificate belongs in the current user’s store (Cert:\CurrentUser\My), which is exactly the opposite of where the CA went in the PEAP guide — that was a machine-wide trust anchor, this is a personal credential.

Confirm the UPN really made it into the SAN, because that is what Taranac matches on:

Terminal window
(Get-ChildItem Cert:\CurrentUser\My)[0].Extensions |
Where-Object { $_.Oid.FriendlyName -match 'Subject Alternative Name' } |
ForEach-Object { $_.Format($true) }

Autoenrollment fails quietly by design, so work down this list rather than guessing.

  • certutil defaults to the machine context. certutil -pulse without -user runs machine autoenrollment — unelevated it returns access denied, elevated it enrolls the computer certificate. Either way the user store stays empty and nothing about the user was ever attempted. Use -user.
  • Elevation changes who you are. A shell elevated with a different account enrolls for that account, into that account’s store. Run user enrollment as the user, unelevated — it needs no administrative rights at all.
  • -pulse reports success when it does nothing. “Completed successfully” only means the cycle ran; it says nothing about whether a certificate was issued. Never treat it as confirmation.
  • The fastest real diagnostic is the manual request. certmgr.mscPersonal → All Tasks → Request New Certificate, as the user. If the template is not listed, it is not published or the user lacks Read/Enroll. If it is listed and fails, the wizard prints the CA policy module’s actual error — which is the one thing no log gives you as directly.
  • Enroll and Autoenroll are different rights. The manual wizard needs Read + Enroll, so a template can enroll by hand and still be skipped silently by autoenrollment, which additionally needs Autoenroll. Verify with Security → Advanced → Effective Access for a real user, not by reading checkboxes — permissions accumulate across groups.
  • User and computer autoenrollment are two independent halves of the policy (Computer Configuration and User Configuration each have their own Certificate Services Client – Auto-Enrollment). A working computer certificate says nothing about the user half. Check HKCU:\Software\Policies\Microsoft\Cryptography\AutoEnrollment\AEPolicy — absent or 0 means user autoenrollment is off.

Same shape as the PEAP rule, with two conditions changed:

DimensionValue
How (method)eap_tls
Who (user groups)your AD-synced group
What / Where / WhenAny / Any / Always
Resultan authorization profile, e.g. Corp-Data

Rules are evaluated first match wins, so place it above the default reject. See NAC policy for the full condition model.

Step 5 — Make the client trust the NAC server certificate

Section titled “Step 5 — Make the client trust the NAC server certificate”

Two ways to close it. In a domain they are not equally good.

Have the domain CA sign Taranac’s NAC server certificate. Every domain member already trusts that root, published to the forest automatically — so there is nothing to distribute, now or when you add machines.

In Taranac, the server certificate can come from an uploaded certificate rather than the internal CA: generate a CSR, sign it on the AD CS, and upload the result under NAC → Settings → PKI. Give it a SAN matching the name clients will pin in Connect to these servers.

This also survives contact with reality better: when the internal CA is rotated, nothing on thousands of clients has to change.

Either way, verify on the client before touching the supplicant — the CA that signed the server certificate must be present machine-wide:

Terminal window
Get-ChildItem Cert:\LocalMachine\Root |
Where-Object { $_.Subject -match 'Taranac|lab-taranac' } |
Select-Object Subject, Issuer

Step 6 — Configure the Windows supplicant

Section titled “Step 6 — Configure the Windows supplicant”

Open the adapter’s Authentication tab, as in the PEAP guide.

Set the method to Microsoft: Smart Card or other certificate. Everything else on this tab behaves as it did for PEAP.

Ethernet Properties with Smart Card or other certificate selected as the 802.1X method Dialog 1 — the only change from PEAP is the method.

Dialog 2 — Smart Card or other Certificate Properties

Section titled “Dialog 2 — Smart Card or other Certificate Properties”
SettingValueWhy
Use a certificate on this computerThe other option is a physical smart card
Use simple certificate selection✅ OnWindows picks the appropriate certificate itself; turn it off only when several certificates qualify and it picks wrong
Verify the server’s identity by validating the certificate✅ OnSame rules as PEAP — see Step 2 there
Connect to these serversThe NAC server certificate’s CNTicked but empty is the trap; see the PEAP guide
Trusted Root Certification AuthoritiesTick the CA that signed the server certificateIn a domain, push this by GPO rather than by hand
Don’t prompt user to authorize new servers or trusted certification authorities✅ OnThe strict setting. Here it is a single checkbox, not the three-option dropdown PEAP shows — same meaning: no click-through on an unverifiable server
Use a different user name for the connectionUsually offLets you pick a certificate whose identity differs from the logged-on user

Smart Card or other Certificate Properties with server validation on and the issuing CA trusted Dialog 2 — certificate on this computer, simple selection, server validation on, and the strict no-prompt checkbox at the bottom.

The CA you tick here is the one from Step 5 — the issuer of the server certificate. It is usually a different CA from the one in Step 1, which is what makes this pair so easy to get half-right: fix only Step 1 and every client refuses to talk; fix only Step 5 and the server rejects every client.

Set Specify authentication mode to User authentication, and the supplicant will use the certificate from the logged-on user’s store. On a domain machine, User or computer authentication also works and is what you would pick once machine certificates are in play.

Advanced settings with the authentication mode list open and single sign-on unchecked Dialog 3 — User authentication for this guide. The single sign-on block below it is what turns this into two-phase machine-then-user authentication; that gets its own page.

Bounce the port and open Logging → NAC → Authentication (/logging/nac/authentication). An EAP-TLS accept shows the resolved username and the matched rule, exactly as PEAP did.

NAC Auth Log filtered to EAP-TLS Filtered to EAP-TLS. The accepts carry the full UPN as the username, the rule that matched (EAP-TLS · AD_Users → Corp-Data) and the VLAN it returned. Rows identifying themselves as host/<fqdn> are the machine phase — a different flow, covered in Machine authentication and SSO.

Note what the username column shows: the UPN from the certificate, not a bare account name. That is the identity Taranac matched against the directory user, and seeing it here is the quickest confirmation that Step 2 resolved the way you intended.

The endpoint gets more than an accept, though. Taranac records the certificate it saw — subject CN, the SAN entries, serial and issuer — against the endpoint under Endpoints (/nac/endpoints). That turns the endpoint list into an inventory of which certificate each device authenticated with, which is what you want on the day a CA has to be rotated or a batch of certificates revoked.

Sessions still come from accounting, not authentication — if an accept appears with no session, see that callout in the PEAP guide.

SymptomCauseFix
TLS handshake fails; little or nothing in the NAC logThe issuing CA is not in Taranac’s bundle — the failure happens inside the EAP layer, before policy runsAttach the AD CS root to the LDAP domain, or upload it under Trusted CAs
Every domain client fails, client certificates are demonstrably fineThe client does not trust the NAC server certificateStep 5 — issue the server certificate from the domain CA, or push Taranac’s CA to clients by GPO
Windows never offers a certificateNo certificate with the Client Authentication EKU in the right storeCheck the template’s EKU and Cert:\CurrentUser\My
Certificate accepted, then rejected — no userThe identity in the certificate matches no Taranac accountConfirm the directory user is synced; check the certificate carries a UPN and that identity match is san_upn
Worked yesterday, whole populations failing todayCRL checking on, with a CA whose CRL is missing or staleRevocation checking demands a valid CRL for every CA in the bundle
Only some users failTheir certificates carry a different subject shape than the domain’s identity-match setting expectsAlign the template, or the identity match field, so they agree
Authenticates as the machine, not the userWindows used the computer certificateSet authentication mode to User authentication
SituationReach for
Domain-joined fleet, AD CS already runningExternal CA + autoenrollment. Zero per-user work, revocation where the rest of your PKI lives
BYOD, contractors, non-domain laptopsInternal PKI — issue per device, deliver by one-time link, revoke centrally
Printers, cameras, IoT that cannot hold a certificateNot EAP-TLS at all — use MAB with endpoint classification
Directory users, no PKI and no appetite for oneEAP-TTLS — verifies by LDAP bind, no certificates on clients