Back to Windows ADCS
Windows ADCSSecurity

ADCS Certificate Template Permissions Deep Dive

"The certificate template looks right. GPO is configured. But users still can't get certificates." 90% of ADCS enrollment problems come down to permissions.

15 min read
ADCS template permissions showing Read, Enroll, and Autoenroll

This guide breaks down how template permissions actually work—the inheritance, the gotchas, and how to troubleshoot when things don't work.

1. The Three Permission Types That Matter

PermissionWhat It DoesWho Needs It
ReadCan see the template existsEveryone who enrolls
EnrollCan manually request a certificateUsers doing manual enrollment
AutoenrollCan receive cert automatically via GPOUsers or computers for autoenrollment

Critical Point

Autoenroll requires ALL THREE permissions: Read + Enroll + Autoenroll. Missing any one = silent failure.

For autoenrollment to work:
Read
Enroll
Autoenroll
GPO configured
Template published to CA

2. Where Permissions Live

There are two places you must check. Both must allow the user or computer, or enrollment fails.

1. Template Security Tab

Certificate Templates Console

certtmpl.msc → Template → Properties → Security
  • • This is where you set who can enroll
  • • Per-template settings

2. CA Security

Certification Authority Console

certsrv.msc → CA → Properties → Security
  • • Controls who can REQUEST from this CA
  • • Need "Request Certificates" permission
  • Often overlooked!

3. Security Principals - Who Gets Permissions

PrincipalUse Case
Domain UsersAll users can enroll (broad)
Domain ComputersAll computers can enroll
Authenticated UsersAnyone authenticated (very broad)
Specific Security GroupRecommended - controlled access
Individual User or ComputerPossible but hard to manage

Best Practice: Create Dedicated Groups

Example Groups:
"PKI-Enroll-WebServers" → Web server template
"PKI-Enroll-Users" → User certificate template
"PKI-Enroll-CodeSigning" → Code signing (restricted)

4. Permission Inheritance Explained

Templates don't inherit from a parent like file permissions. But group membership is evaluated, nested groups ARE followed, and Deny overrides Allow.

The Inheritance Trap

User: jsmith
Member of: IT-Staff
IT-Staff member of: Domain Users
Template permissions:
- Domain Users: Enroll
- IT-Staff: (not listed)
Result: jsmith CAN enroll (via Domain Users)

The Deny Trap

Template permissions:
- Domain Users: Enroll
- Contractors: Deny Enroll ✗
User: contractor1
Member of: Domain Users, Contractors
Result: contractor1 CANNOT enroll (Deny wins)

5. Effective Permissions - What Actually Applies

Method 1: Advanced Security Settings

  1. Certificate Templates Console (certtmpl.msc)
  2. Right-click template → Properties → Security
  3. Click "Advanced"
  4. Click "Effective Access" tab
  5. Select a user or computer
  6. View actual permissions

Method 2: PowerShell

# Get template permissions
$template = "WebServer"  # Template name
$configNC = (Get-ADRootDSE).configurationNamingContext
$templateDN = "CN=$template,CN=Certificate Templates,CN=Public Key Services,CN=Services,$configNC"

Get-Acl "AD:$templateDN" | Select-Object -ExpandProperty Access | 
    Where-Object { $_.ActiveDirectoryRights -match "ExtendedRight" } |
    Format-Table IdentityReference, AccessControlType, ObjectType

Method 3: Test Enrollment

# Attempt enrollment and see what happens
certreq -submit -attrib "CertificateTemplate:WebServer" request.req

6. Common Misconfigurations

Misconfiguration 1: Autoenroll Without Enroll

Symptom:Autoenrollment doesn't work, no errors
Problem:Template has Autoenroll but not Enroll permission
Fix:Add BOTH Enroll AND Autoenroll

Misconfiguration 2: Template Not Published

Symptom:"The requested certificate template is not supported"
Problem:Template exists but not published to the CA
Fix:CA console → Certificate Templates → New → Template to Issue

Misconfiguration 3: CA Request Permission Missing

Symptom:"You do not have permission to request a certificate"
Problem:User can enroll on template, but can't request from CA
Fix:CA Properties → Security → Add user/group → "Request Certificates"

Misconfiguration 4: Nested Group Not Evaluated

Symptom:User in nested group can't enroll
Problem:Token bloat, group not in user's token
Fix:Check tokenGroups attribute, simplify nesting

Misconfiguration 5: Domain Local Groups for Computers

Symptom:Computer autoenrollment fails
Problem:Used Domain Local group, computer is in different domain
Fix:Use Global or Universal security groups for cross-domain

Misconfiguration 6: Authenticated Users Removed

Symptom:Random enrollment failures
Problem:Removed "Authenticated Users" Read permission
Fix:Authenticated Users needs at least Read on templates

7. The Enrollment Permission Flow

When a user or computer requests a certificate, the system checks multiple permission gates. Understanding this flow helps you diagnose failures.

What Happens During Enrollment

Can read template?
YES ↓ NO → "Template not found"
Has Enroll permission?
YES ↓ NO → "Access denied" or "You do not have permission"
CA Request permission?
YES ↓ NO → "Request denied by policy module"
Template published?
YES ↓ NO → "Template not supported by this CA"
Other requirements met?
YES ↓ NO → Various errors (key size, CSP, etc.)
Certificate Issued

8. Autoenrollment Troubleshooting

The Autoenrollment Checklist

Template has Read permission for target
Template has Enroll permission for target
Template has Autoenroll permission for target
Template published to at least one CA
CA has Request Certificates permission for target
GPO enables autoenrollment
GPO linked to correct OU
GPO applying to target (gpresult /r)
Target can reach CA (network and firewall)
No conflicting Deny permissions

Force Autoenrollment to Run

# User certificates
certutil -pulse

# Computer certificates (run as SYSTEM or restart)
gpupdate /force

Check Autoenrollment Events

Event Viewer → Applications and Services Logs → 
  Microsoft → Windows → CertificateServicesClient-AutoEnrollment

9. PowerShell Permission Management

View Template Permissions

# List all permissions on a template
Import-Module ActiveDirectory
$templateName = "WebServer"
$configNC = (Get-ADRootDSE).configurationNamingContext
$templateDN = "CN=$templateName,CN=Certificate Templates,CN=Public Key Services,CN=Services,$configNC"

(Get-Acl "AD:$templateDN").Access | 
    Select-Object IdentityReference, AccessControlType, ActiveDirectoryRights |
    Format-Table -AutoSize

Grant Enroll Permission

# Add Enroll permission for a group
$templateName = "WebServer"
$groupName = "PKI-Enroll-WebServers"
$configNC = (Get-ADRootDSE).configurationNamingContext
$templateDN = "CN=$templateName,CN=Certificate Templates,CN=Public Key Services,CN=Services,$configNC"

$acl = Get-Acl "AD:$templateDN"
$group = New-Object System.Security.Principal.NTAccount($groupName)
$enrollGuid = [Guid]"0e10c968-78fb-11d2-90d4-00c04f79dc55"  # Enroll extended right

$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
    $group,
    "ExtendedRight",
    "Allow",
    $enrollGuid
)
$acl.AddAccessRule($ace)
Set-Acl "AD:$templateDN" $acl

Grant Autoenroll Permission

# Add Autoenroll permission
$autoenrollGuid = [Guid]"a05b8cc2-17bc-4802-a710-e7c15ab866a2"  # Autoenroll extended right

$ace = New-Object System.DirectoryServices.ActiveDirectoryAccessRule(
    $group,
    "ExtendedRight",
    "Allow",
    $autoenrollGuid
)
$acl.AddAccessRule($ace)
Set-Acl "AD:$templateDN" $acl

10. Security Considerations (ESC Connection)

Overly permissive templates are the root cause of ESC (escalation) attacks. Template permissions are a critical security control.

RiskPermission Problem
ESC1Any user can enroll + supply arbitrary SAN
ESC2Any user can enroll + dangerous EKU
ESC3Enrollment agent permissions too broad
ESC4Users can modify template permissions

Permission Hardening Checklist

No "Authenticated Users" or "Domain Users" on sensitive templates
Use dedicated security groups for enrollment
Review who has "Write" on templates (ESC4)
Review who has "Full Control" on PKI objects
Certificate Manager approval for sensitive templates
Audit template permission changes

11. Quick Reference

Permission Requirements by Scenario

ScenarioReadEnrollAutoenrollCA Request
Manual enrollment (GUI)-
Manual enrollment (certreq)-
Autoenrollment (GPO)
Web enrollment-
NDES or SCEP-

Error Message Decoder

ErrorLikely Cause
"Template not found"Missing Read permission or not published
"You do not have permission"Missing Enroll permission on template
"Access denied"Missing Enroll or CA Request permission
"Request denied by policy"CA security or issuance requirements
"Template not supported by this CA"Template not published to CA
Silent autoenroll failureMissing any of: Read, Enroll, Autoenroll

12. Frequently Asked Questions

Why does autoenrollment require both Enroll and Autoenroll permissions?

Autoenroll is an additional permission, not a replacement. It says "you can receive this automatically" but you still need basic Enroll permission to actually get the certificate.

I added permissions but enrollment still fails. Why?

Check: 1) Template is published to the CA, 2) User has "Request Certificates" on the CA itself, 3) No Deny permissions via group membership, 4) Run gpupdate /force and certutil -pulse.

Should I give Domain Users enroll permission?

Only for truly universal templates (like basic User cert). For anything else, use dedicated security groups. Over-permissioned templates are the #1 cause of ADCS security issues.

How can I see who currently has enrollment rights?

Use the PowerShell commands in section 9, or open certtmpl.msc, right-click the template, go to Properties → Security, and click Advanced to see all permission entries.

Related Resources