Cross-signed intermediate on Windows Server
When a CA migrates its root certificate, new certificates are issued from a new intermediate that chains to a new root. Older clients that do not know the new root break the TLS handshake. A cross-signed intermediate bridges the new issuing CA and the old root, so both modern and older clients can validate the chain.
This guide shows how to add, force, remove, and distribute cross-signed intermediates on Windows Server. The examples are based on the three CAs FairSSL actively sells: GlobalSign and AlphaSSL, Sectigo with PositiveSSL, and DigiCert with RapidSSL.
Current deadline: 27 July 2026 for GlobalSign and AlphaSSL
GlobalSign runs two parallel root hierarchies, one RSA-based and one ECC-based, because RSA and ECC certificates require their own algorithm all the way up the chain. On 27 July 2026 all new certificates move to the TLS-dedicated roots R46 (RSA) and E46 (ECC). Cross-signed intermediates from the old roots R3 (RSA) and R5 (ECC) are delivered alongside, so older clients can still validate. Browser trust in R3 (RSA) is removed for good on 15 April 2027, and trust in R5 (ECC) is removed on 15 April 2029. Source: GlobalSign Support: Upcoming Changes to TLS Roots.
After 27 July 2026, GlobalSign issues new RSA certificates from R46 and new ECC certificates from E46. Check whether your oldest clients (Java 7, older Android, older embedded devices) can validate R46/E46 without the old roots. If they can, send only the short chain. If they cannot, attach the cross-cert version R46-by-R3 (RSA) or E46-by-R5 (ECC) to the server bundle until those clients have been replaced.
Which chain do you have?
Find the product you ordered from FairSSL and the cross-cert chain that goes with it. The table reflects the situation as of 2026, after the ongoing root migrations.
| Product from FairSSL | New issuing CA | Cross-signed via | Official source |
|---|---|---|---|
| AlphaSSL DV (RSA) | GlobalSign GCC R6 AlphaSSL CA 2025 (under R6) → GlobalSign GCC R46 AlphaSSL CA 2025 (under R46) after 27 Jul 2026 | R6 → R46 cross-cert (R46 signed by R6) | AlphaSSL KB |
| DomainSSL DV (RSA and ECC) | Both key types currently chain to R3 (SHA-256). Migrating to an R46-based intermediate before 27 Jul 2026. | R46 cross-signed by R3 during the transition window | Migration KB |
| OrganizationSSL OV / ExtendedSSL EV (RSA) | RSA intermediate under R3 → R46-based intermediate after 27 Jul 2026 | R46 (RSA) cross-signed by R3 (RSA) | Migration KB |
| OrganizationSSL OV / ExtendedSSL EV (ECC) | ECC intermediate under R5 → E46-based intermediate after 27 Jul 2026 | E46 (ECC) cross-signed by R5 (ECC) | Migration KB |
| Sectigo PositiveSSL DV (RSA) | Sectigo Public Server Authentication CA DV R36 | R46 cross-signed by USERTrust RSA CA, AAA Certificate Services | Sectigo KB |
| Sectigo OV/EV (RSA) | Sectigo Public Server Authentication CA OV/EV R36 | R46 cross-signed by USERTrust RSA CA, AAA Certificate Services | Sectigo KB |
| DigiCert Basic OV (RSA) | DigiCert Global G2 TLS RSA SHA256 2020 CA1 | G2 trusted directly; G5 cross-sign retired 15 May 2026 | DigiCert KB |
| RapidSSL DV (RSA) | RapidSSL Global TLS RSA4096 SHA256 2022 CA1 (under DigiCert Global Root G2) | G2 trusted directly until 15 April 2029 | DigiCert root list |
Sectigo's official distribution page lists nine variants (root, DV/OV/EV in RSA and ECC, plus cross-sign bundles). The files were last updated June-July 2025 and can be downloaded directly from crt.sh or via the Sectigo KB page above.
Cross-cert files you need
The actual files to download and import on the server. Find your CA, grab the file, and follow the procedure below that matches your scenario.
GlobalSign and AlphaSSL
Official overview: GlobalSign Cross Certificates KB
- R46 signed by R6 (RSA 4096, valid until 10 Dec 2034) - used for AlphaSSL and GlobalSign RSA certificates under the new R46 hierarchy
r6r46cross2019.crt - R46 signed by R3 (RSA 4096, valid until 18 Mar 2029) - alternative chain back to the R3 root
r3r46cross2019.crt - E46 signed by R5 (ECC, valid until 19 Jan 2038) - for ECC certificates under the new E46 hierarchy
r5e46cross2019.crt - R6 signed by R3 (RSA 4096, valid until 18 Mar 2029) - for legacy paths back to the older R3 root
r3r6cross2019.crt
Sectigo (PositiveSSL and others)
Official overview: Sectigo Public Roots and Hierarchy KB
- USERTrust RSA Certification Authority (root, goes into Trusted Root)
crt.sh/?d=1199354 - R46 signed by USERTrust (cross-cert intermediate, goes into Intermediate store)
crt.sh/?d=11405654893 - Sectigo Public Server Authentication CA DV R36 (issuing intermediate)
crt.sh/?d=4267304690 - OV R36: crt.sh/?d=4267304698
EV R36: crt.sh/?d=4267304687
DigiCert and RapidSSL
Official overview: DigiCert Trusted Root Authority Certificates
- DigiCert Global Root G2 is trusted directly in current Windows, macOS, iOS, Android, and major browser root stores, with browser trust scheduled until 15 Apr 2029. A cross-cert is normally not needed.
- G5 cross-signed roots are retired on 15 May 2026. Replacements are listed on the same KB page under "G5 Cross-Signed Roots".
- Migration plan: Multipurpose → dedicated TLS root hierarchies
Tip: always check the file's issue date and expiry before importing it. The CAs roll out new versions over time, and a cross-cert listed here may have been replaced with a newer variant. If unsure, go to the CA's official KB page (linked at the top of each column) and see which file they currently recommend.
Server and client roles in chain selection
What the server does
The server presents ONE chain in the TLS handshake, not several. Schannel/IIS builds the chain via CertGetCertificateChain from what is in the Windows certificate store and picks the shortest valid path to a trusted root.
For an AlphaSSL certificate after 27 July 2026, the two options look like this:
- The short path: server cert → GlobalSign GCC R46 AlphaSSL CA 2025 → GlobalSign Root R46 (the new CA root).
- The long path via cross-cert: server cert → GlobalSign GCC R46 AlphaSSL CA 2025 → "GlobalSign Cross Certificate R6-R46" → GlobalSign Root CA - R6.
When both paths are available in the server's certificate store, Windows Server only delivers the short version to the client, even if the client actually needs the long one. The client never sees the cross-cert chain.
To force the server to send the cross-cert chain, the short path has to be made invalid locally on the server. The standard method is to disable the new CA root (R46) in Trusted Root via MMC, while keeping the cross-cert version in the Intermediate store. Schannel can no longer build the short chain and falls back to the cross-cert path. The full installation procedure is described in Install the cross-signed intermediate on Windows Server below.
The chain grows longer with every migration
AlphaSSL today chains up to R6. Clients that only have R3 (not R6) in their trust store need the cross-cert R6 signed by R3 (r3r6cross2019.crt) to validate.
After 27 July 2026, AlphaSSL chains up to R46. Clients with only R6 trusted need R46 signed by R6 (r6r46cross2019.crt). Clients with only R3 trusted need R46 signed by R3 (r3r46cross2019.crt) or both cross-certs stacked to reach all the way down: r6r46cross2019.crt + r3r6cross2019.crt.
What the client does with it
The client receives the one chain the server sent and runs its own local validation on top of it. Each client looks for the first root in the chain it trusts and stops there.
Which chain the server sends depends on which roots the server itself has enabled in its Trusted Root store. For the AlphaSSL R46 example:
- Server with R46 enabled (default): builds and sends the short chain to R46. Only clients with R46 in their trust store validate.
- Server with R46 disabled, R6 enabled: builds and sends the medium chain via cross-cert
R46 signed by R6up to R6. Clients with R46 OR R6 trusted validate (the R46 client matches Subject = R46 in the cross-cert against its own R46 root; the R6 client matches Issuer = R6 against its own R6 root). - Server with R46 and R6 disabled, R3 enabled: builds and sends the long chain via two cross-cert links up to R3. Clients with R46, R6, or R3 trusted all validate.
Pick the server setup that covers the oldest client population you have to support. Long chains cost handshake bytes for every client, so if none of your clients need the R3 path, leave R6 enabled.
The only way to make the server send the cross-cert chain is to disable the new CA root (and possibly the middle root) locally, so Schannel cannot build the short path. The bundle the CA issues will not do it for you: Microsoft's Root Cert Program installs the new root in Trusted Root anyway, and Schannel then picks the shorter path regardless of what the bundle contains.
Install the cross-signed intermediate on Windows Server
AlphaSSL example: import the cross-cert r3r6cross2019.crt into Intermediate Certification Authorities and disable GlobalSign Root R6 in Trusted Root. Swap the cross-cert file to match the certificate you actually have.
1. Get the files
Grab the relevant cross-cert file from Cross-cert files you need above.
2. Open MMC for Computer Account
- Press Win+R, type
mmc, click OK. Confirm the UAC prompt. - In MMC: menu File → Add/Remove Snap-in... (or Ctrl+M).
- In the left list, select Certificates → click Add >.
- Select Computer account → Next. This is the choice that matters, not "My user account".
- Select Local computer → Finish → OK.
3. Import the cross-cert into Intermediate Certification Authorities
- In the left pane, expand Certificates (Local Computer) → Intermediate Certification Authorities → click the Certificates sub-folder.
- Right-click the Certificates folder → All Tasks → Import...
- The Certificate Import Wizard starts. Click Next.
- Click Browse..., select the cross-cert file. Switch the file-type dropdown to All Files (*.*) if the file is not visible. Select → Open → Next.
- Confirm the store is Intermediate Certification Authorities → Next → Finish → OK.
- Press F5. The cross-cert file is now in the list. Double-click to verify Subject (what the certificate says about itself) and Issuer (who signed it).
- If you need to cover several layers (e.g. also
r6r46cross2019.crt), repeat steps 2-6 for each file.
4. Disable the new CA root in Trusted Root
Otherwise Schannel finds the new root in Trusted Root and builds the short chain, leaving your cross-cert sitting unused in the Intermediate store.
- In the left pane, navigate to Trusted Root Certification Authorities → Certificates.
- Find the new CA root that matches the new chain. For the AlphaSSL R6 hierarchy: GlobalSign Root R6. For the R46 era after 27 July 2026: GlobalSign Root R46.
- First verify by double-clicking the Details tab that Subject = Issuer (it is a root, not a cross-cert).
- Right-click the certificate → Properties → General tab.
- Select Disable all purposes for this certificate → OK. Or, more precisely: select Enable only the following purposes and clear the checkbox next to Server Authentication alone.
- If the server also needs to send the chain all the way down to R3 (for clients that only have R3 trusted), repeat the same procedure for GlobalSign Root R6. Schannel then falls back to the long chain via both cross-certs.
Each disabled root makes every TLS handshake about 1 KB larger. Disable only the roots you actually need.
5. Restart Windows Server
After changes to Trusted Root and Intermediate stores, a full Windows restart is the only reliable way to flush the Schannel and HTTP.SYS cache for cert chains. iisreset alone does not touch the chain cache in lsass, and net stop http does not touch the Schannel cache either. Always plan a reboot window when disabling or swapping roots.
6. Verify from outside
After the reboot, test live from the internet with the FairSSL SSL Scanner or SSL Labs. The top root in the delivered chain should now be the old one (R3 or R6, depending on your choice), not the new R46. If the chain still ends at R46, the deactivation has not taken effect, or another R46 root copy is still "enabled" in Trusted Root.
Rolling out to many servers? Build a GPO that pushes the cross-cert files to Public Key Policies → Intermediate Certification Authorities, and pushes the roots you want disabled to Public Key Policies → Untrusted Certificates. A reboot is still required on each server, so plan it alongside your next maintenance window.
Want to revert to the default? Re-enable the root in Trusted Root (Properties → Enable all purposes or Enable only the following purposes → Server Authentication checked) and restart Windows Server. The cross-cert file can stay in the Intermediate store; Schannel picks the short path again as long as the new root is enabled.
Verification
The only reliable verification is to scan the server from outside and see the chain the client actually receives. Local MMC only shows what Windows thinks the chain should be, not what HTTP.SYS sends after a cache flush.
- Internet-facing server: use the FairSSL SSL Scanner. It shows the full chain the server delivers and simulates several client populations.
- Internal server (no internet access): use testssl.sh from another machine on the network. Command:
testssl.sh --chain server.internal.local:443shows the entire chain the server sends.
Troubleshooting
"Chain issues: Incomplete" on SSL Labs or FairSSL Scanner
The server is not sending the intermediate in the handshake. Check that the intermediate (issuing or cross-signed) sits in Cert:\LocalMachine\CA, not in Cert:\CurrentUser\CA. Restart the HTTP stack after the import. Some clients (Windows, browsers) fetch the missing intermediate themselves through an AIA lookup and get through anyway, but most open-source clients do not wait for an AIA lookup and report the failure immediately.
Client reports "untrusted issuer" even though the certificate is valid
The client's trust store does not know the top root the chain points to. If the client only has the old root (R3) and you send a short chain to the new one (R46), validation fails. Add the cross-cert version to the server bundle so the client can follow the path all the way up to R3.
Windows ignores my newly imported cross-cert
HTTP.SYS keeps a chain cache per binding. Restart with net stop http /y followed by net start http and net start w3svc. iisreset alone is not always enough. On Exchange boxes: stop and start MSExchangeServiceHost and IIS Admin Service.
AIA fetch fails behind a firewall or proxy
Windows tries to fetch the missing issuer cert over HTTP from the URL in the AIA extension. If outbound 80/tcp is blocked, it fails silently. The symptom is a server that builds chains fine in the lab but not in production. Import the intermediate into the CA store explicitly so Windows does not need the lookup.
Deleted root certificate reappears after a restart
That is the Microsoft Root Certificate Program. Use GPO to disable the root, or import it into the Untrusted store. A plain delete is rolled back automatically through Windows Update. See Microsoft's documentation under Microsoft Trusted Root Program requirements.
Why does it work for some clients and not others?
A broken or incomplete certificate bundle produces random results across clients. Some clients fetch the missing intermediate themselves via the AIA extension in the server cert. Others keep batches of known intermediates cached in the background and get through anyway. It looks like "it works for me", but the next user with the same browser version and a cold cache hits the failure.
In practice, mobile phones, Safari, and Firefox are usually the first to fail when the server forgets the intermediate. Windows and Chrome can often perform an AIA lookup and rescue the situation, which masks the bug. If the page works in Edge on a Windows machine, the assumption is that it works for everyone, and the problem only surfaces when a customer calls in from an iPhone.
Scott Helme's experiment shows this unpredictability exactly. He configured a server to send only the leaf certificate (no intermediate) and disabled the relevant root locally. First attempt: both Chrome and Firefox failed as expected. A later attempt with the same server setup: Firefox worked, Windows still failed. Firefox had in the meantime fetched and cached the missing intermediate via its "Intermediate CA Preloading" feature, which pulls batches of known intermediates daily. Read his walkthrough here: Cross-signing & alternate trust paths: how they work.
Never rely on the client to rescue an incomplete chain. The server has to send the complete bundle with all intermediates, and if you need to cover older clients via a cross-cert chain, the server has to actively send that chain, not assume the clients will find it themselves.
Related content
Intermediate installation
Foundational guide for installing an intermediate in different formats and on different platforms.
Certificate chain troubleshooting
How to diagnose broken chains, missing intermediates, and which root the chain points to.
Choosing a certificate authority
The strategic background for CA flexibility, root migration, and why cross-signing exists.
Simple-ACME guide
Automate the entire certificate lifecycle on Windows Server, including importing new chains at renewal.
SSL Scanner
Check live whether your server delivers a complete chain and which root it points to.
Installation service
FairSSL installs cross-certs and tests the chain on your servers. Fixed price per server.
Frequently asked questions about cross-signed intermediates
Find answers to the most common questions about SSL certificates and FairSSL.
certutil -verify -urlfetch path\to\server.crt and look for the line "Application[0] = ... Server Authentication". It prints the selected chain with the thumbprint of each link. Alternatively, open the certificate in MMC and click the "Certification Path" tab. The first link going up is the one Windows chose.Cert:\LocalMachine\CA (not only in the CurrentUser store). Restart the HTTP service: net stop http /y && net start http && net start w3svc. Verify afterwards with our SSL Scanner or openssl s_client -connect your-domain.com:443 -showcerts.Want us to install the cross-cert chain for you?
Create a free account and issue your first certificate in under 10 minutes.