Alle Windows-Server auf ablaufende Zertifikate prüfen mit PowerShell

    Zertifikate mit PowerShell verwaltenLäuft etwa ein SSL-Zertifikat auf einem Web-Server, RD Gateway oder WSUS-Server ab, dann ist deren Service in der Regel nicht mehr zu­gänglich. Um solche Situa­tionen zu ver­meiden, sollte man die Gültig­keit von Zertifi­katen laufend prüfen. Das lässt sich auch mit einem PowerShell-Script erledigen.

    Für Web-Server, die über das öffentliche Internet erreichbar sind, gibt es zahlreiche Online-Dienste, die in regelmäßigen Intervallen prüfen, wann Zertifikate ablaufen und den Webmaster rechtzeitig verständigen. Im Firmennetz können viele Monitoring-Tools diese Aufgabe übernehmen.

    Wer sich dafür auf die Bordmittel beschränken möchte, kann zu PowerShell greifen. Mit Hilfe eines relativ einfachen Scripts lassen sich alle Server auf Zertifikate abklappern, die ihr Ablaufdatum in Kürze erreichen.

    Alle Server aus dem AD auslesen

    Das folgende Beispiel liest dazu alle Computer aus dem Active Directory aus, die unter Windows Server laufen, und greift remote auf deren Zertifikat­speicher unter LocalMachine\my zu. Es gibt alle Zertifikate aus, die in weniger als 14 Tagen ablaufen oder die bereits abgelaufen sind.

    Um zu verhindern, dass das Script hängt, wenn ein Server nicht erreichbar ist, prüft der Aufruf von Test-Connection, ob der betreffende Ziel-Host online ist.

    Bei Bedarf könnte man die Liste der Server einschränken, indem man mit SearchBase bestimmte OUs angibt oder sie alternativ aus einer Textdatei ausliest.

    Interaktive Ausführung des Scripts zur Prüfung des Ablaufdatums von Zertifikaten

    Das Script ist zudem für die interaktive Ausführung gedacht und zeigt mit Write-Progress den Fortschritt der Operation an. Stattdessen könnte man es natürlich für die Ausführung als Task optimieren und sich per E-Mail benachrichtigen lassen, falls ein Zertifikat in Kürze abläuft.

    1 Kommentar

    Marc sagt:
    3. September 2020 - 9:41

    Gute Idee und schönes kleines Script!

    Beim Invoke-Command habe ich noch "-ScriptBlock { XXXXXXX } anfügen müssen.


    $cred = Get-Credential
    $c = 0
    $servers = Get-ADComputer -Filter "OperatingSystem -like 'Windows Server*'"
    $servers | foreach {
    $p = ($c++/$servers.count) * 100
    Write-Progress -Activity "Prüfe $_" -Status "$p % fertig" -PercentComplete $p;
    if(Test-Connection -ComputerName $_.DNSHostName -Count 2 -Quiet){
    Invoke-Command -ComputerName $_.DNSHostName -Credential $cred `
    -ScriptBlock { {dir Cert:\LocalMachine\my | ? NotAfter -lt (Get-Date).AddDays(14)} }
    }
    }

    Was man auch machen kann ist die Variante über ein Monitoring Tool. Beispielsweise Check_MK (gibts auch als Community Variante) oder Paessler. Die können das auch abfragen.

    Für hausinterne Zertifikate bei Windows Systemen gefällt mir persönlich die automatische Verlängerung (GPO gesteuert etc.) am besten. Bei gekauften von externen Stellen unterschriebenen Zertifikaten kann das eine gute Ergänzung sein.

    Wie so oft muss man sagen --> kommt drauf an was für einen das passende ist!