Built for AD CS
Your root stays in AD CS. CertKit holds only the subordinate key.
AD CS is good at what it was built for. Domain-joined Windows machines auto-enroll against a certificate template, renew on their own, and nobody thinks about it again. The trouble starts with everything else. An nginx box, a FortiGate, an F5, a Linux host, anything not joined to the domain has no auto-enrollment path at all, so somebody requests the certificate by hand, exports it with its private key, converts the format, and copies it onto the machine. Then does it again at every renewal.
CertKit runs as a subordinate CA beneath your existing AD CS root. Certificates chain to the root your devices already trust, and the CertKit Agent deploys each renewal to the systems auto-enrollment was never going to reach.
Your root stays in AD CS. CertKit holds only the subordinate key.
CertKit generates a subordinate CA key and a certificate signing request. You sign it in AD CS against the built-in Subordinate Certification Authority template and import the result. From then on CertKit issues from that subordinate.
Because the chain terminates at your existing root, there is no trust rollout. Every machine that already trusts your enterprise root trusts these certificates the moment they are issued. Your root key never leaves wherever it lives today, whether that is an online issuing CA, an offline root, or an HSM.
The manual process, if you want to do it yourself:
certsrv web enrollment page or build a request file and submit it with
certreq -submit. For a system that cannot generate its own request, you create
the request on a domain-joined machine on its behalf.
openssl pkcs12 -in cert.pfx -out cert.pem -nodes and split the result into the
certificate, the key, and the chain files your platform expects.
Every step is manual, and AD CS will not repeat any of it when the certificate renews. The domain-joined half of your estate renews itself while the other half waits on a person with a PFX file and an OpenSSL command. It is also the half most likely to be a load balancer or a firewall, where a missed renewal takes something visible down.
A lot more of this work is about to land on you. Public CAs are leaving the client authentication business entirely. Let's Encrypt dropped the client auth extension from its default profile in February 2026 and closed the last opt-in profile in July, so the final public client certificates expire in early October. DigiCert removes the extension in March 2027 and Chrome's root program bars it two weeks later. Every public path out closes.
Anyone who was using a public certificate for mTLS, 802.1X, or device identity now needs a private CA to issue those certificates, and in a Windows environment that root is almost always AD CS. That is a pile of new certificates arriving on exactly the systems auto-enrollment cannot reach. Automation is the only sustainable way to run them. Here's how CertKit does it.
Your AD CS CertKit Your systems
┌─────────────────┐ ┌─────────────────┐ ┌──────────────────┐
│ │ │ │ │ │
│ Root CA │ │ │ │ ┌─────────────┐ │
│ │ │ │ │ │ │CertKit Agent│ │
│ │ signs │ │ │ │ └──────┬──────┘ │
│ ▼ CSR │ │ │ │ │ │
│ ┌──────────┐ ──────► Subordinate CA │ │ ▼ │
│ │ Sub CA │ │ │ │ │ │ nginx [x] │
│ │ request │ │ │ ▼ │ │ F5 [x] │
│ └──────────┘ │ │ Issue & Renew ────► Linux [x] │
│ │ │ │ │ appliances [x] │
└─────────────────┘ └─────────────────┘ └──────────────────┘
your root no DNS deployed and
never moves validation verified
Certificates issued from your subordinate skip domain validation entirely. There is no ACME challenge, no CNAME, and no public CA involved, because you are the authority. CertKit issues, the agent deploys, and CertKit then connects to confirm the certificate is actually being served.
CertKit is an invaluable tool for administrators managing public TLS certificates in Microsoft environments like Always On VPN (SSTP) and DirectAccess (IP-HTTPS), as it simplifies and fully automates Let's Encrypt certificate issuance and renewal. CertKit eliminates the security risks and complexities of manual DNS challenges or API key exposure.
Richard Hicks, Consultant and Microsoft MVP
Auto-enrollment is a Group Policy mechanism. It needs a domain-joined machine with a computer account, which is exactly what a FortiGate, an F5, or a hardened Linux appliance does not have and should not have. The workarounds people reach for are NDES and SCEP, which means standing up another Windows role, publishing it, and maintaining a challenge password mechanism that many appliances implement partially or not at all.
CertKit does not compete with auto-enrollment and does not replace it. Domain-joined machines should keep enrolling the way they always have. The subordinate covers the remainder, using the deployment path CertKit already runs for every platform it supports, and it does it without another Windows role to patch.
Internal certificates are rarely the whole picture. The same estate usually runs public certificates on IIS and Exchange, client authentication on NPS, and remote access on Always On VPN and AD FS. CertKit runs public and private issuance side by side from one account, with one inventory across both.
If you do not have an internal root today, or want to retire the one you have, CertKit's managed PKI can operate the whole hierarchy instead.
Free 90-day trial. No credit card required. Direct access to our engineering team to get you set up.