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.
Two ways to get client certificates
Section titled “Two ways to get client certificates”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 issues | External CA — Taranac only trusts | |
|---|---|---|
| Who signs | Taranac’s built-in Certificate Authority | Your existing issuer: AD CS, a corporate PKI, a partner’s CA |
| Delivery to the device | Download a PKCS#12, or email a one-time link; optional auto-issue on user creation | However that CA already does it — for AD CS, autoenrollment by group policy |
| Revocation | Revoke in Taranac; CRL published automatically | Handled by the issuing CA, consumed by Taranac via CRL/OCSP |
| Fits | BYOD, contractors, non-domain machines, printers and IoT | Domain-joined fleets that already have a working PKI |
| Work per user | One 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:
- Internal CAs — every enabled CA Taranac runs itself
- Trusted CAs — external CA certificates you upload (
/nac/settings/trusted-cas) - 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.
Step 3 — Issue the certificate
Section titled “Step 3 — Issue the certificate”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
mailattribute — 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:
gpupdate /forcecertutil -user -pulseVerify the certificate arrived, and note where it landed:
Get-ChildItem Cert:\CurrentUser\My | Select-Object Subject, EnhancedKeyUsageList, NotAfterA 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:
(Get-ChildItem Cert:\CurrentUser\My)[0].Extensions | Where-Object { $_.Oid.FriendlyName -match 'Subject Alternative Name' } | ForEach-Object { $_.Format($true) }When the certificate never arrives
Section titled “When the certificate never arrives”Autoenrollment fails quietly by design, so work down this list rather than guessing.
certutildefaults to the machine context.certutil -pulsewithout-userruns 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.
-pulsereports 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.msc→ Personal → 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 or0means user autoenrollment is off.
Open NAC → Settings → PKI (/nac/settings/pki) and issue a certificate of
type user, linked to the Taranac account it represents. Set the subject and
SAN so the identity matches what Step 2 expects — the UPN for a directory user.
Deliver it as a password-protected PKCS#12, or have Taranac email the user a
one-time download link so you never handle key material yourself. Import it
into Cert:\CurrentUser\My on the client.
Taranac can also auto-issue a certificate whenever a local user is created or an LDAP user is first synced, which turns this step into no step at all. See PKI & trust.
Step 4 — Add the policy rule
Section titled “Step 4 — Add the policy rule”Same shape as the PEAP rule, with two conditions changed:
| Dimension | Value |
|---|---|
| How (method) | eap_tls |
| Who (user groups) | your AD-synced group |
| What / Where / When | Any / Any / Always |
| Result | an 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.
Keep the Taranac-issued server certificate and push Taranac’s internal CA to domain clients as a trusted root, via Computer Configuration → Policies → Windows Settings → Security Settings → Public Key Policies → Trusted Root Certification Authorities.
Correct, and fine when the NAC server certificate is already in place and you do not want to touch it. The cost is that you now maintain two trust anchors across the fleet instead of one.
Either way, verify on the client before touching the supplicant — the CA that signed the server certificate must be present machine-wide:
Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Subject -match 'Taranac|lab-taranac' } | Select-Object Subject, IssuerStep 6 — Configure the Windows supplicant
Section titled “Step 6 — Configure the Windows supplicant”Open the adapter’s Authentication tab, as in the PEAP guide.
Dialog 1 — the Authentication tab
Section titled “Dialog 1 — the Authentication tab”Set the method to Microsoft: Smart Card or other certificate. Everything else on this tab behaves as it did for PEAP.
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”| Setting | Value | Why |
|---|---|---|
| Use a certificate on this computer | ✅ | The other option is a physical smart card |
| Use simple certificate selection | ✅ On | Windows 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 | ✅ On | Same rules as PEAP — see Step 2 there |
| Connect to these servers | The NAC server certificate’s CN | Ticked but empty is the trap; see the PEAP guide |
| Trusted Root Certification Authorities | Tick the CA that signed the server certificate | In a domain, push this by GPO rather than by hand |
| Don’t prompt user to authorize new servers or trusted certification authorities | ✅ On | The 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 connection | Usually off | Lets you pick a certificate whose identity differs from the logged-on user |
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.
Dialog 3 — Advanced settings
Section titled “Dialog 3 — Advanced settings”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.
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.
Step 7 — Watch it authenticate
Section titled “Step 7 — Watch it authenticate”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.
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.
Troubleshooting
Section titled “Troubleshooting”| Symptom | Cause | Fix |
|---|---|---|
| TLS handshake fails; little or nothing in the NAC log | The issuing CA is not in Taranac’s bundle — the failure happens inside the EAP layer, before policy runs | Attach the AD CS root to the LDAP domain, or upload it under Trusted CAs |
| Every domain client fails, client certificates are demonstrably fine | The client does not trust the NAC server certificate | Step 5 — issue the server certificate from the domain CA, or push Taranac’s CA to clients by GPO |
| Windows never offers a certificate | No certificate with the Client Authentication EKU in the right store | Check the template’s EKU and Cert:\CurrentUser\My |
| Certificate accepted, then rejected — no user | The identity in the certificate matches no Taranac account | Confirm the directory user is synced; check the certificate carries a UPN and that identity match is san_upn |
| Worked yesterday, whole populations failing today | CRL checking on, with a CA whose CRL is missing or stale | Revocation checking demands a valid CRL for every CA in the bundle |
| Only some users fail | Their certificates carry a different subject shape than the domain’s identity-match setting expects | Align the template, or the identity match field, so they agree |
| Authenticates as the machine, not the user | Windows used the computer certificate | Set authentication mode to User authentication |
When to use what
Section titled “When to use what”| Situation | Reach for |
|---|---|
| Domain-joined fleet, AD CS already running | External CA + autoenrollment. Zero per-user work, revocation where the rest of your PKI lives |
| BYOD, contractors, non-domain laptops | Internal PKI — issue per device, deliver by one-time link, revoke centrally |
| Printers, cameras, IoT that cannot hold a certificate | Not EAP-TLS at all — use MAB with endpoint classification |
| Directory users, no PKI and no appetite for one | EAP-TTLS — verifies by LDAP bind, no certificates on clients |
Related
Section titled “Related”- 802.1X authentication — how each method behaves
- PKI & trust — CAs, server certificate, CRL, EST enrollment
- LDAP directories — directory integration and sync
- 802.1X with PEAP — server-certificate trust, in detail