First Issuance manual, with automated renewals
Published May 13 2024 10:24 AM 2,314 Views
Microsoft

Hey all Rob Greene again. Seems like I have been on this PKI kick lately, and today is not going to be any different.

Occasionally, I will get a customer who must get certificates issued for things like Web sites, and they must have custom Subject Alternative Name (SAN) DNS values on the issued certificate.  They hate that their web server admins must submit the request, and then as Certificate Authority Managers, they must look in the Certification Authorities database and review the Pending Requests table.

 

Some background

 

The first question that they ask is if there is a way to not require them (the CA Manager) to approve the request as this slows down the process of getting the certificate issued.  From a technical perspective most of you would know that the answer is YES, you can configure the certificate template to automatically issue.  However, this is NOT a good thing to do, and is seen as a Microsoft CA vulnerability; if you have a CA audit happen you might fail the audit because you allowed this. This specific vulnerability is considered the ESC1 vulnerability.

ESC1 wants either an Enrollment Agent to cross sign the certificate request, a CA Manager to review the request, or both to validate the information in the Subject Alternative Name (SAN), when the certificate template’s Subject Name tab is set to “Supply in the request”, before allowing the certificate to be issued.  This is recommended since the submitter is allowed to enter unvalidated information in the SAN, unlike when the certificate templates Subject Name tab is configured for “Build from this Active Directory information”.

 

How to protect the template against ESC1?

 

Given this background information, you should already be thinking to yourself, “Rob is not going to tell me to break anything security wise.”, and you would be correct.  Rather, I am going to tell you that any certificate template that you have configured for “Supply in the request”, should at a minimum be configured to require CA Manager approval.

 

RobGreene_0-1710453234421.png

 

Then for something like the certificate template that Network Device Enrollment Services (NDES) uses for its certificate, I would advise you to use the Enrollment Agent configuration. The Exchange Enrollment Agent (Offline request) template has the Enhanced Key Usage (EKU) of “Certificate Request Agent”, and this is the certificate NDES uses to sign the Certificate Service Request (CSR) that the SCEP client sends to the NDES Server.

 

RobGreene_1-1710453234428.png

 

Of course, I am just giving some good examples of real-world certificate templates that you are going to be using within the environment.  The last part is that the security permissions SHOULD be locked down as to who can enroll for each of these certificate templates.

 

Specifically, enrollment for the two Certificate templates needed by the NDES services, it should be the CA Manager NDES Admin and the NDES Server.  The Exchange Enrollment Agent (Offline request) and CEP Encryption certificate templates should be locked down as to who can request enrollments.

 

Just like the custom Adatam Web Server certificate template, only IIS (Internet Information Services) Admins, and IIS Web Servers should have access to this template to be able to enroll with it.

 

RobGreene_2-1710453234435.png

 

So what can you do for me here?

 

Let’s first discuss the scenario that I am going to cover in the blog.  Although I would love to cover all the possible uses that all you lovely internetz users might have for certificate enrollment, this blog will have to end at some point.

 

The Scenario

 

IIS Admins are tired of remembering to go to all their web servers and request new certificates for them before they expire. The CA Manager is also tired of the IIS Admins always sending emails nagging that they need their certificate enrollment requests issued. Then always having to go to the Certification Authority snap-in to approve/issue the same certificates over and over each year because of rules that web server certificates can only be valid for 398 days. See (https://thehackernews.com/2020/09/ssl-tls-certificate-validity-398.html)

 

What is the solution?

 

Side bar:

If you want to modify the settings of any default certificate template, it is best to duplicate the original certificate template and then make changes to it.  This is recommended so that you always have the default templates available in case you must create a new template in the future that is based off the original template.  If the original template is modified two to three years down the line, you may not remember what was changed so that it could be changed back to the original template configuration.  As far as naming goes, we would recommend that you put your company name or initials in the template name and keep the original template name after that.  In this blog you will see the template used is called Adatam Web Server.  This is a customized template based off the Web Server template.

Keep in mind that this can be done for any certificate template that has the Subject Name tab configured for “Supply in the request”, this not limited to just web server certificates. 

 

I am in, so what’s next

 

As you can imagine, there are several things that need to be configured to get this working:

  1. A Security group needs to be created for Users who are going to request the certificate via the Local Computer Certificate enrollment wizard based on the certificate template.
  2. A security group needs to be created for the computer accounts that need the certificate issued based on the security template.
  3. Certificate template needs to be created.
  4. Certificate template changes need to be made to support this enrollment method.
  5. Certificate template Permissions need to be configured.
  6. Group Policy setting for Computer Certificate Autoenrollment

 

Security groups need to be created.

 

The first two steps should be self-explanatory as to how to create groups and set up the group scopes.  We are not going to cover group creation in this blog.  I do want to point out one thing that happens often: Most Administrators seem to remember that if you add a user to a group, the user needs to log off and back on before the group can be added to their tokens.  When adding a computer account to a new group it also needs to log off and back on before the group membership can be added to its token.  Typically, the log off and back on for a computer will be a computer reboot; that needs to happen after the new group membership is added to its token.

 

Certificate Template creation and changes

 

The base template that you use to duplicate can of course be anything you would like, but in our example, we are just going to duplicate the good’ol faithful Web Server certificate template.

 

  1. Launch the Certificate Template snapin:  CertTmpl.msc
  2. Find the certificate template named:  Web Server
  3. Right click on the Web Server template and select Duplicate Template.
  4. The Compatibility tab, set the values as you wish. 

 

NOTE: Stay away from using anything higher than Windows Server 2012 R2/Windows 8.1 for your templates if you are using CEP and CES as these two web services have problems seeing templates with compatibility higher than this.

 

RobGreene_3-1710453234439.png

 

 

  1. The General tab, type in a descriptive name for the new certificate name you are configuring.
  2. The Request Handling tab, set the values that make sense for your template.

NOTE: It might make sense to set the checkbox “Renew with the same key”.

 

  1. The Cryptography tab, you may want to modify the Minimum key size value and select the Provider Category and Providers that makes sense for the certificate templates use.

 

NOTE: I would strongly suggest NOT setting Use alternate signature format on the template either.  This is a proprietary format that many applications will not understand.  This check box will only be available when you are using a Key Storage Provider (KSP) provider type.

RobGreene_4-1710453234445.png

 

  1. The Issuance Requirements tab is where the heavy lifting is happening.
    1. Check the box “CA certificate manager approval”.
    2. Select the radio option “Valid existing certificate” under the Require the following for reenrollment section toward the bottom of the dialog box. 
  1. The Security tab is where the security groups that were created for the server admins and the servers themselves need to be configured on the template. You would add both security groups, and they only need the Allow Enroll permissions.  Neither group should have the Autoenroll permission defined on it.
  2. When done setting the other options for the template, click the OK button.

 

Setup the computer certificate autoenrollment group policy

 

Next, we are not going to cover how to create a Group Policy Object, and things like GPO ordering, etc. We are going to discuss just the policy settings that are important for the discussion of this blog.

  1. Launch Group Policy Management Console:  GPMC.msc
  2. Either create a new Group Policy or modify an existing one.
  3. Navigate to: Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\Public Key Policies.
  4. Double click on the policy setting “Certificate Services Client - Auto-Enrollment”.
  5. Enable the policy, and check the two boxes:
    • Renew expired certificates, update pending certificates, and remove revoked certificates.
    • Update certificates that use certificate templates.

NOTE: To learn more about these two settings I would recommend going over to Vadims blog.  He does a great job of explaining what each of these do:  https://www.sysadmins.lv/blog-en/certificate-autoenrollment-in-windows-server-2016-part-3.aspx

  1. Click the OK button on the dialog box.
  2. Close the Group Policy Management Editor.
  3. Link the Group Policy object to what seems appropriate within your Active Directory structure.

 

Trying to test this feature, but it seems like the renewal does not work.

 

Of course, with any of these things, you should always test things before relying on the solution in a production environment. I do want to caution you about setting up a test environment and then setting up the certificate for a short issuance period as this tends not to work out well for most customers, and they eventually end up calling stating that autoenrollment is not working.

 

There are few things to keep in mind about certificate automatic enrollment / automatic renewal process.

The first thing to remember is that certificate auto enrollment / renewal only happens on the following triggers:

  1. At User logon, or computer boot, for the corresponding security context.
  2. Every 8 hours after user logon, or computer boot. This means that after the user or computer has been logged in or turned on for 8 hours then the auto enrollment code will happen again for the security context in question.

To trigger auto-enrollment to run manually you have two options.

  1. Run GPUpdate /Force. Part of the function that this does is it causes an autoenrollment cycle to happen.  This can be a bit much especially if you are applying a lot of user and computer group policy.  This will trigger both computer and user autoenrollment to run.
  2. Use one of the two CertUtil command lines based on which security context you want enrollment to run against.
    1. For computer: CertUtil -Pulse
    2. For User: CertUtil -User -Pulse

 

Certificate renewal WILL NOT happen until 90% of the Certificate lifetime has expired. Trying to use the template setting “Renewal period” does not change this fact.

 

Auto enrollment / renewal attempt MUST happen while the certificate is still valid, and after the start of the 10% certificate lifetime left and the expiration time of the certificate. (MUST NOT BE EXPIRED).  Like being unable to re-animate something that is already dead, you cannot renew a certificate that has already expired.

 

RobGreene_5-1710453234453.png

 

The math that needs to be done is: (CertLifeTimeInDays * 24) * .10

The value from the above MUST be larger than 8 hours.

 

Let's do some math

 

Here is an example: Set up a certificate that is valid for two days for testing and we will run through the exercise here:

  • Find out how many hours the certificate is valid for: 2*24 = 48 Hrs.
  • Figure out what 10% of certificate lifetime in hours is: 48 *.10 = 4.8 Hrs.

This shows us that for one of these certificates to be renewed, the process that runs only every 8 hours would have to run within this 4.8 Hrs. window. This is going to tell us that sometimes you would get lucky with a certificate renewal attempt being done, but more than likely MOST of the time you would fail to renew the certificate because it would expire before the auto enrollment cycle happens.

 

Another example is a certificate that is valid for 4 days. Let us run through the exercise here.

  • Find out how many hours the certificate is valid for: 4*24 = 96 Hrs.
  • Figure out what 90% of certificate lifetime in hours is: 96 *.10 = 9.6 Hrs.

This shows us that for at a 10% lifetime left it is still valid for over 8 hours. This certificate would always get at least one auto enrollment cycle to be run to renew the certificate.  Assuming you don’t have anything else wrong, the renewal would happen successfully. This is the minimum lifetime that any certificate testing should be set to.

 

Test, test, and more testing!

 

Well, now you got your test lab, issuing short lived certificates and getting them automatically renewed, but…  Now you are noticing that your application is not using the new certificate.

 

Unfortunately, there are going to be some applications for which the automatic renewal might not work out well in your organization.  However, the certificate could still be renewed manually by your IIS admins, and it would still not require the CA manager to be involved in the renewal process. The key thing is your IIS Admins would need to go through the manual certificate renewal process BEFORE the current certificate expires, as it is used to cross sign the renewal request. 

UPDATE 5/30/2024:

After release of the blog it was brought to my attention of two different things to consider.

First unknown to me (as I am not an IIS support engineer) apparently there is a setting within the IIS Management console to help with updating the site binding configuration so that this automatic renewal behavior would work.  This feature is called Certificate Rebind and was new in IIS 8.5.  https://learn.microsoft.com/en-us/iis/get-started/whats-new-in-iis-85/certificate-rebind-in-iis85 

 

Second, we recently has a case were the customer had several websites running on an IIS Web Server.  These websites all used unique certificates and were all generated manually using the same certificate template.  When one of the certificates were ready to be renewed, they found that all website certificates were archived, and only one of the website certificates were automatically renewed.  This would be by design behavior.  The only thing that we could really recommend in this situation is to use one certificate for all websites and make sure that all the websites DNS names were added to the certificates Subject Alternative Name (SAN) field.

 

Failure to do this will result in going through the entire manual issuance of the certificate all over again. And, going through the CA Manager approval process as well, since this would be a new certificate request.

 

Hopefully, you found some good nuggets of information about how to lockdown certificate templates to protect against ESC1 vulnerabilities and what some of those less often used tabs do.  And of course, how the certificate renewal process works, especially around shot lived certificates.

 

Rob “I coulda been a Welder” Greene

 

Extra credit for those who can figure out where the saying came from.

7 Comments
Brass Contributor

Thanks for sharing this @RobGreene, cool stuff :lol:!!!

Brass Contributor

is there a way to specify a SAN attribute of our choice ? For e.g., if it is a User cert, would like the SAN to include the "samAccountName" attribute.

Microsoft

@prakashjha You would get that option from the pure fact of the template being configured as "Supply in the request" on the subject name tab.

You can look at this blog for more information about that how to set the SAN field.
We need to discuss the Microsoft Certification Authority Web Enrollment (CAWE) Role - Microsoft Comm...

Thank you @RobGreene that's extremely helpful. Is there any thrive to deprecate Web Server default template? It does not support auto-enrollment, misses quite some features. Flipside creating a modern webserver template no longer works with IIS cert request which are often used with or without SAN from AD. Can you follow me? 
Also the AD CS Web only works with the original Webserver template not with new ones. This is often a hindrance for everyday admins, to not using modern templates at all so they do not loose these ways for cert requests. Am I missing something (not an expert in this matter).

Microsoft

Hey @Karl_Wester-Ebbinghaus 

 

I get as frustrated as you and other customers about the whole IIS mmc situation.  We in Directory Services support have no say so as to what the IIS development team is going to do with the product.  I would actually have to refer you to an IIS team to get an answer for these questions.  The only thing that I can state from the Windows Directory Services side is to use the certificate request MMC wizard to do your certificate enrollment.

 

You statement above about the IIS MMC snapin and the AD CS Web Enrollment pages are the exact reason I have been writing these last two blog posts.  I hear from you AD / AD CS admins everyday about how these tools are really starting to show their age.  All I can show you as the new ways of enrolling for certificates without the AD CS Web Enrollment pages as browser security has gotten tighter and tighter over the years, and the nature of web servers hosting tons of different websites has changed so much just since Windows Server 2008.  Most of the code you are talking about was written back in Windows Server 2000.  Even NDES is just server manager wrapped MSCEP tool that shipped with the Windows Server 2003 resource kit tools.

 

Also you should keep a look out for another blog I am writing about custom certificates for Remote Desktop as I am really tired of seeing those cases come into Directory Services as well since it is really Remote Desktop components responsible for the enrollment and renewal of those certificates when using the Group Policy setting.

 

@RobGreene I am fine to take this with me offline. Thanks for seconding my point. Thought it would be just minor annoyance and because it do not like UX inconsistencies. 

Copper Contributor

Can Group Managed Service Accounts use certificate auto enrollment? In the certificate templates, it looks you can only choose "Computer or other device" or "User" as the type of subject. I would like a gMSA to have auto-enrolled certificates so that it can authenticate with this certificate to a registerd Azure Entra application (Registered App). My intention was grant the gMSA the ability to upload it's own public key to the credentials. I would bootstrap the process by configuring a temporary client secret in Azure Entra ID. 

 

I would rather have an gMSA where no one in the org knows or could reset the password instead of using a standard service account.

Co-Authors
Version history
Last update:
‎May 30 2024 02:36 PM
Updated by: