Walidacja PowerShell i powiadomienie o wygaśnięciu certyfikatu SSL

Nieoczekiwane wygaśnięcie certyfikatu serwera może powodować szereg nieprzyjemnych konsekwencji dla klientów: niemożność nawiązania bezpiecznego połączenia, błędy uwierzytelnienia, irytujące ostrzeżenia w przeglądarce itp. W tym artykule pokażemy, jak używać programu PowerShell do sprawdzania ważności certyfikatów SSL / TLS w zdalnych witrynach, a także wygasających certyfikatów w magazynach certyfikatów na serwerach i komputerach domeny.

Treść

  • Sprawdź poprawność wartości certyfikatu SSL na stronach internetowych za pomocą PowerShell
  • Wyszukaj wygasające certyfikaty w magazynie certyfikatów systemu Windows

Sprawdź poprawność wartości certyfikatu SSL na stronach internetowych za pomocą PowerShell

Niedawno witryna https://winitpro.ru/ została przeniesiona do protokołu HTTPS przy użyciu bezpłatnego certyfikatu SSL od Szyfrujmy. Osobliwością tych certyfikatów jest to, że są one wydawane na okres 90 dni, po których należy je zaktualizować (odnowić). Zwykle certyfikaty Let's Encrypt są odnawiane przez specjalne skrypty lub boty po stronie hosta lub serwera (w systemie Windows może to być WACS, w systemie Linux - Certbot). Ale czasami automatyzacja może się nie powieść. Chciałbym mieć własny system weryfikacji i powiadamiania o wygaśnięciu certyfikatów SSL na stronach. Zaimplementowałem to w PowerShell. Ponieważ weryfikujemy certyfikat witryny za pomocą żądania HttpWeb, nie potrzebujesz uprawnień administratora na zdalnej stronie / serwerze.

W następnym skrypcie PowerShell musisz podać listę witryn, w których chcesz sprawdzić okres ważności certyfikatu, a także liczbę dni przed wygaśnięciem certyfikatu, aby rozpocząć wyświetlanie powiadomień ($ minCertAge). Jako przykład podałem 80 dni.

$ minCertAge = 80
$ timeoutMs = 10000
$ sites = @ (
„https://winitpro.ru”,
„https://site1.com/”,
„https://site2.ru/”
)
# Wyłącz sprawdzanie poprawności certyfikatu
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ site w $ sites)

Write-Host Check $ site -f Green
$ req = [Net.HttpWebRequest] :: Utwórz ($ site)
$ req.Timeout = $ timeoutMs
spróbuj $ req.GetResponse () | Out-Null catch Błąd weryfikacji adresu URL zapisu-hosta $ site ': $ _ -f Red
[datetime] $ certExpDate = $ req.ServicePoint.Certificate.GetExpirationDateString ()
[int] $ certExpiresIn = ($ certExpDate - $ (get-date)). Dni
$ certName = $ req.ServicePoint.Certificate.GetName ()
$ certThumbprint = $ req.ServicePoint.Certificate.GetCertHashString ()
$ certEffectiveDate = $ req.ServicePoint.Certificate.GetEffectiveDateString ()
$ certIssuer = $ req.ServicePoint.Certificate.GetIssuerName ()
if ($ certExpiresIn -gt $ minCertAge)
Certyfikat Write-Host dla $ site wygaśnie za $ certExpiresIn dni [$ certExpDate] -f Green
jeszcze

$ message = "Certyfikat witryny $ site wygaśnie za $ certExpiresIn dni"
$ messagetitle = "Odnów certyfikat"
Napisz-Host $ wiadomość [$ certExpDate]. Szczegóły: „n'nCert nazwa: $ certName'Cert odcisk palca: $ certThumbprint'nCert data wejścia w życie: $ certEffectiveDate'nCert wystawca: $ certIssuer -f Red
# wyświetl wyskakujące powiadomienie i wyślij list do administratora
#ShowNotification $ messagetitle $ wiadomość
# Send-MailMessage -From [email protected] -To [email protected] -Podmiot $ messagetitle -body $ wiadomość -SmtpServer smtp.winitpro.ru -Encoding UTF8

host zapisu „________________” n

Ten skrypt PowerShell sprawdzi certyfikaty SSL dla wszystkich witryn z listy. Jeśli zostanie znaleziony certyfikat, który wkrótce wygasa, zostanie podświetlony w ostrzeżeniu.

Aby powiadomić administratora o zbliżającym się wygaśnięciu certyfikatu SSL, możesz dodać wyskakujące powiadomienie. Aby to zrobić, odkomentuj komunikat ShowNotification $ messagetitle $ message i dodaj funkcję:

Funkcja ShowNotification ($ MsgTitle, $ MsgText)
Add-Type -AssemblyName System.Windows.Forms
$ global: balmsg = New-Object System.Windows.Forms.NotifyIcon
$ path = (Get-Process -id $ pid). Ścieżka
$ balmsg.Icon = [System.Drawing.Icon] :: ExtractAssociatedIcon ($ path)
$ balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon] :: Ostrzeżenie
$ balmsg.BalloonTipText = $ MsgText
$ balmsg.BalloonTipTitle = $ MsgTitle
$ balmsg.Visible = $ true
$ balmsg.ShowBalloonTip (10000)

Możesz także dodawać powiadomienia e-mail za pomocą Send-MailMessage..

W rezultacie, jeśli zostaną wykryte wygasłe lub wygasające certyfikaty, zostaniesz o tym powiadomiony za pomocą listu i wyskakującego komunikatu.

Pozostaje utworzyć automatyczne zadanie harmonogramu, które powinno być wykonywane 1-2 razy w tygodniu i uruchomić skrypt PowerShell w celu sprawdzenia okresu ważności certyfikatów witryny HTTPS (możesz utworzyć zadanie harmonogramu do uruchomienia pliku PS1 za pomocą Register-ScheduledTask).

Wyszukaj wygasające certyfikaty w magazynie certyfikatów systemu Windows

Może być również potrzebny skrypt, który będzie monitorował okres ważności certyfikatów używanych do usług kryptograficznych na serwerach (na przykład certyfikatów na RDS, Exchange, SharePoint, LDAPS itp.) Lub na komputerach użytkowników.

Na komputerze lokalnym możesz uzyskać listę certyfikatów, które wkrótce wygasną, za pomocą polecenia Get-ChildItem -Path cert. Powershell 3.0 ma specjalny argument -ExpiringInDays:

Get-ChildItem -Path cert: -Recurse -ExpiringInDays 30

W PowerShell 2.0 podobne polecenie wygląda następująco:

Get-ChildItem -Path cert: -Recurse | gdzie $ _. notafter -le (get-date) .AddDays (30) -AND $ _. notafter -gt (get-date) | wybierz odcisk palca, temat

Aby sprawdzić tylko własne certyfikaty, użyj kontenera Cert: \ LocalMachine \ My zamiast rootowania Cert:. W ten sposób nie będziesz sprawdzać certyfikatów głównych Windows i certyfikatów komercyjnych.

Aby znaleźć certyfikaty, które wygasają w ciągu najbliższych 30 dni na wszystkich serwerach w domenie, możesz użyć następującego skryptu PowerShell:

$ servers = (get-adcomputer -LDAPFilter "(& (objectCategory = computer) (OperatingSystem = Windows Server *) (! serviceprincipalname = * MSClusterVirtualServer *) (! (userAccountControl: 1.2.840.113556.1.4.803: = 2)))) „). Nazwa
Wynik $ = @ ()
foreach ($ server w $ servers)

$ ErrorActionPreference = "SilentlyContinue"
$ getcert = Invoke-Command -ComputerName $ server Get-ChildItem -Path Cert: \ LocalMachine \ My -Recurse -ExpiringInDays 30
foreach ($ cert w $ getcert)
$ result + = New-Object -TypeName PSObject -Property ([zamówiony] @
„Serwer” = $ serwer;
„Certyfikat” = $ cert.Issuer;
„Expires” = $ cert.NotAfter
)


Wynik-zapis $ wynik

Otrzymasz więc listę wygasających certyfikatów na serwerach i będziesz miał wystarczająco dużo czasu na ich odnowienie.