Zum Inhalt springen

Aktualisieren der Windows Certificate Trust Lists in „disconnected environments“

Die Certificate Trust Lists sind die von Microsoft im Regelfall automatisch mit Windows Update aktualisierten Listen, ob einer Certificate Authority vertraut wird oder ob bestimmte Zertifikate zurückgezogen wurden und daher nicht mehr vertrauenswürdig sind.

Insgesamt ein sensiblen Thema, da es bereits genug Vorfälle gab, wo bis dahin gültige Zertifikate zur Treibersignierung entwendet wurden und Malware signiert wurde. Vor so einem „falschen Treiber“ schützt einen nur eine aktuelle Liste von gültigen Zertifikaten.

Bei so gut wie allen Unternehmen werden die Windows Server über ein dediziertes Patchmanagement mit den Aktualisierungen aus Redmond versorgt und nicht per Windows Update. Sei es mit dem Microsoft System Center Configuration Manager oder Symantecs Patch Management Solution – eines ist meistens identisch: Die Certificate Trust Lists werden nicht mit aktualisiert.

Microsoft hat sich merkwürdigerweise dazu entschieden, diese Listen nur direkt per Windows Update zu aktualisieren. Für sogenannte „disconnected environments“ hat Microsoft im Jahr 2013 ein Security-Update herausgebracht, dass ein paar Workarounds liefert, damit diese Listen von den Systemen z.B. von einer Netzwerk-Freigabe bezogen werden können.

Die Listen müssen regelmäßig in die Netzwerk-Freigabe geladen werden, damit die per GPO konfigurierten Systeme diese beziehen und mit aktuellen Listen versorgt sind. Zugriff benötigen neben einem Benutzer, der diese Freigabe per Scheduled Task regelmäßig füllt (Read/Write) auch die Domain Computers (Read).

Wer möchte, der kann sich auch eine ADM-Datei (RootDirURL.adm) bauen und die auf den Systemen notwendigen Einstellungen per Gruppenrichtlinie verteilen. Die notwendigen Einstellungen sind im bereits oben genannten KB-Artikel zu finden.

Da einen Microsoft jedoch damit alleine lässt, wie man diese Listen regelmäßig heruntergeladen bekommt, habe ich dafür ein paar PowerShell-Zeilen zusammengeschrieben. Voraussetzung ist, dass der ausführende Server entweder einen Zugang zum Internet hat oder diesen per vom Script einzutragenen Proxy temporär erhalten kann.

Sollte das Script bei der Ausführung auf einen Fehler stoßen, wird dies im EventLog des Systems im Application Log unter der EventID 41020 notiert. Sollte alles glatt verlaufen sein, wird auch dies unter EventID 41020 eingetragen, jedoch nicht als Error, sondern als Information. So kann man den Vorgang auch mit dem eigenen Monitoring-Tool überwachen.

Das Script findet Ihr auch im GitHub-Repository.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
<#
.SYNOPSIS
Downloads the Trusted Root Authority Certificates, Untrusted Certificates List, Revocation Lists and Root List Signer Lists.
 
.DESCRIPTION
The Trusted Root Authority Certificates, Untrusted Certificates List, Revocation Lists and Root List Signer Lists are by default downloaded and updated by windows update.
This script downloads the neccessary files from windows update and saves them on a central destination, so the files can be imported by group policy settings.
 
.PARAMETER proxy
If defined as true, the script sets an proxy server and deletes these settings after.
 
.PARAMETER share
This parameter is mandatory and is used to place the downloaded files within the network.
 
.NOTES 
    File Name	: Update-WindowsCertificateStore.ps1
    Author		: Timo Ewiak (tew@logikkreise.de)
 
.EXAMPLE
.\Update-WindowsCertificateStore.ps1
.\Update-WindowsCertificateStore.ps1 -proxy proxy:80 -share \\DEV.LAN\system$\RootCertificates
#>
 
Param (
	[Parameter(Mandatory=$true)]
    $share,
    [Parameter(Mandatory=$false)]
    $proxy
)
 
############## DEFINING VARIABLES START #############################
$certutil = "C:\Windows\System32\certutil.exe"
$Arguments = "-syncWithWU $share"
$netsh = "C:\Windows\System32\netsh.exe"
$ProxySet = "winhttp set proxy proxy-server=$proxy"
$ProxyRemove = "winhttp reset proxy"
############## DEFINING VARIABLES END #############################
 
if (![System.Diagnostics.EventLog]::SourceExists("Update-WindowsCertificateStore"))
{
    New-EventLog -LogName "Application" -Source "Update-WindowsCertificateStore"
}
 
# Delete the old files within the share
Remove-Item "$share\*" -Recurse -Force -ErrorAction Stop
 
# Set the proxy if the variable is defined
if($proxy -ne $null){
 
    Start-Process -FilePath $netsh -ArgumentList $ProxySet -Wait -NoNewWindow -ErrorAction Stop
}
 
# Tests if it can reach the download servers from microsoft.
# Starts the download of the neccessary files and saves them to the defined network share.
if(Test-NetConnection ctldl.windowsupdate.com){
 
    $log = Start-Process -FilePath $certutil -ArgumentList $Arguments -Wait -NoNewWindow -ErrorAction Stop -PassThru
    #$log.ExitCode | Out-File -FilePath "$PSScriptRoot\error.txt"
    $errorcode = $log.ExitCode
 
	# Write Event-Log-Entry if success
    if($log.ExitCode -eq "0")
    {
        Write-EventLog -LogName Application -source Update-WindowsCertificateStore -eventID 41020 -EntryType Information -message "Successfully downloaded the Trusted Root Authority Certificates, Untrusted Certificates List, Revocation Lists and Root List Signer Lists." -ErrorAction Stop
    }
 
	# Write Event-Log-Entry if error
    if($log.ExitCode -ne "0")
    {
        Write-EventLog -LogName Application -source Update-WindowsCertificateStore -eventID 41020 -EntryType Error -message "Something went wrong. Could not download the files from microsoft, cause error code: $errorcode" -ErrorAction Stop
    }
}
 
# Delete the proxy after usage and if the variable is defined
if($proxy -ne $null){
 
    Start-Process -FilePath $netsh -ArgumentList $ProxyRemove -Wait -NoNewWindow -ErrorAction Stop
}

Ein Gedanke zu „Aktualisieren der Windows Certificate Trust Lists in „disconnected environments““

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.