When Windows Servers have Turn off Automatic Root Certificate Update enabled via Group Policy (under Computer Configuration/Administrative Templates/System/Internet Communication Management), it creates a chain reaction affecting cryptographic operations. Modern code-signing certificates like those from GlobalSign rely on Microsoft's Certificate Trust List (CTL) auto-update mechanism.
// Sample PowerShell to check the policy status
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot" -Name "DisableRootAutoUpdate" | Select-Object DisableRootAutoUpdate
Windows uses a background process called Automatic Root Certificates Update (part of the Crypt32 chain) to:
- Fetch new root certificates via HTTP from Microsoft's CTL distribution points
- Validate certificate chains during installation/execution
- Cache intermediate certificates in the Local Machine store
When disabled, servers never receive critical updates like:
// Example of missing root CA thumbprint (GlobalSign)
Thumbprint Subject
---------- -------
ABC123... CN=GlobalSign Root CA, OU=Root CA, O=GlobalSign nv-sa, C=BE
Organizations disable this feature primarily for:
- Air-Gapped Networks: Prevent servers from contacting external Microsoft endpoints
- Change Control: Avoid undocumented modifications to the Trusted Root store
- Compliance: Meet strict cryptographic policies (e.g., FIPS 140-2 requirements)
For environments where policy changes aren't feasible:
# Manual import of required root certificate
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import("\\path\to\globalsign_root.cer")
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store(
"Root", "LocalMachine")
$store.Open("ReadWrite")
$store.Add($cert)
$store.Close()
Alternatively, modify your installer to include the root certificate chain:
<!-- WiX installer example -->
<Component Id="RootCert" Guid="YOUR-GUID">
<Certificate Id="GlobalSignRoot"
StoreName="Root"
StoreLocation="localMachine"
BinaryKey="GlobalSignCer"
/>
</Component>
Post-deployment validation steps:
# Verify certificate chain
signtool verify /v /kp YourInstaller.msi
# Check root store contents
Get-ChildItem -Path Cert:\LocalMachine\Root | Where-Object {$_.Subject -like "*GlobalSign*"}
In enterprise Windows environments, we frequently encounter servers with Automatic Root Certificate Update disabled through Group Policy (Computer Configuration -> Administrative Templates -> System -> Internet Communication Management -> Internet Communication settings -> Turn off Automatic Root Certificate Update). This setting creates unexpected challenges for software vendors distributing code-signed installers.
From working with numerous customers, we've identified three primary reasons:
1. Security Compliance: Some regulatory frameworks require strict control over certificate authorities
2. Air-Gapped Networks: Systems without internet access can't utilize automatic updates
3. Legacy System Stability: Preventing unexpected certificate changes in critical infrastructure
When this policy is enabled, Windows cannot automatically fetch missing root certificates. For our GlobalSign-signed installer, this manifests as:
Error: A file that is required cannot be installed because the cabinet file [...]
has an invalid digital signature. This may indicate that the cabinet file is corrupt.
To check the current policy state programmatically:
# PowerShell command to verify the setting
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot" -Name "DisableRootAutoUpdate"
To manually inspect trusted roots:
certmgr.msc
Navigate to: Trusted Root Certification Authorities -> Certificates
Option 1: Temporary Policy Adjustment
# PowerShell to temporarily enable updates (requires admin)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\SystemCertificates\AuthRoot" -Name "DisableRootAutoUpdate" -Value 0
Option 2: Manual Certificate Import
# Command to import GlobalSign root certificate
certutil -addstore -f "Root" GlobalSignRoot.crt
For large-scale deployments, consider these approaches:
1. Package the root certificate with your installer
2. Use Group Policy Preferences to deploy the certificate
3. Implement a pre-installation check script:
$rootStore = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root","LocalMachine"
$rootStore.Open("ReadOnly")
$certificate = $rootStore.Certificates | Where-Object {$_.Subject -like "*GlobalSign*"}
if (-not $certificate) {
Write-Warning "Missing GlobalSign root certificate"
}
- Clearly document certificate requirements in your installation guide
- Provide a standalone certificate installer option
- Implement graceful fallback mechanisms for offline environments
- Consider timestamping your signatures to maintain validity after certificate expiration