Ověření platnosti PowerShell a oznámení o vypršení platnosti certifikátu SSL

Neočekávané vypršení platnosti certifikátu serveru může mít pro vaše klienty řadu nepříjemných následků: neschopnost navázat bezpečné připojení, chyby ověřování, nepříjemná varování v prohlížeči atd. V tomto článku si ukážeme, jak používat PowerShell ke kontrole vypršení platnosti certifikátů SSL / TLS na vzdálených serverech, jakož i vypršení platnosti certifikátů v úložištích certifikátů na serverech a počítačích s doménami.

Obsah:

  • Ověřte hodnoty certifikátů SSL na webových stránkách pomocí prostředí PowerShell
  • Vyhledejte certifikáty, jejichž platnost vyprší, v úložišti certifikátů Windows

Ověřte hodnoty certifikátů SSL na webových stránkách pomocí prostředí PowerShell

Nedávno byl web https://winitpro.ru/ převeden do protokolu HTTPS pomocí bezplatného certifikátu SSL od společnosti Pojďme se zašifrovat. Zvláštností těchto certifikátů je to, že jsou vydávány na dobu 2007 90 dny, po kterých je třeba je aktualizovat (obnovit). Obnovení certifikátů Let's Encrypt se obvykle provádí pomocí speciálních skriptů nebo robotů na straně hostingu nebo serveru (na Windows to může být WACS, na Linux Certbot). Automatizace však někdy může selhat. Chtěl bych mít svůj vlastní systém ověřování a oznamování uplynutí platnosti certifikátů SSL na webech. Implementoval jsem to na PowerShell. Protože ověřujeme certifikát webu pomocí požadavku HttpWeb, na vzdáleném webu / serveru nepotřebujete administrátorská práva.

V dalším skriptu PowerShell musíte určit seznam webů, na kterých chcete zkontrolovat dobu platnosti certifikátu, a také kolik dní před vypršením platnosti certifikátu, aby se začaly zobrazovat oznámení ($ minCertAge). Jako příklad jsem uvedl 80 dní.

$ minCertAge = 80
$ timeoutMs = 10000
$ sites = @ (
"https://winitpro.ru",
"https://site1.com/",
"https://site2.ru/"
)
# Zakázat ověření certifikátu
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ site in $ sites)

Write-Host Zkontrolujte $ site -f Green
$ req = [Net.HttpWebRequest] :: Vytvořit ($ site)
$ req.Timeout = $ timeoutMs
zkuste $ req.GetResponse () | Out-Null chytit Chyba ověření adresy URL zápisu $ site ': $ _ -f Red
[datetime] $ certExpDate = $ req.ServicePoint.Certificate.GetExpirationDateString ()
[int] $ certExpiresIn = ($ certExpDate - $ (get-date))
$ certName = $ req.ServicePoint.Certificate.GetName ()
$ certThumbprint = $ req.ServicePoint.Certificate.GetCertHashString ()
$ certEffectiveDate = $ req.ServicePoint.Certificate.GetEffectiveDateString ()
$ certIssuer = $ req.ServicePoint.Certificate.GetIssuerName ()
if ($ certExpiresIn -gt $ minCertAge)
Certifikát typu Write-Host pro web $ vyprší za $ certExpiresIn days [$ certExpDate] -f Green
jinde

$ message = "Platnost certifikátu pro web $ $ vyprší za $ certExpiresIn days"
$ messagetitle = "Obnovit certifikát"
Napište zprávu $ Host [$ certExpDate]. Podrobnosti: 'n'nCert name: $ certName'Cert thumbprint: $ certThumbprint'nCert date: $ certEffectiveDate'nCert emitent: $ certIssuer -f Red
# zobrazí vyskakovací oznámení a pošle dopis administrátorovi
#ShowNotification $ messagetitle $ message
# Send-MailMessage -Od [email protected] -To [email protected] -Subject $ messagetitle -body $ message -SmtpServer smtp.winitpro.ru -Encoding UTF8

write-host "________________" 'n

Tento skript PowerShell zkontroluje SSL certifikáty pro všechny weby ze seznamu. Pokud je nalezen certifikát, jehož platnost brzy vyprší, bude zvýrazněn v upozornění.

Chcete-li správce informovat o nadcházejícím vypršení platnosti certifikátu SSL, můžete přidat vyskakovací oznámení. Chcete-li to provést, odkomentujte řádek ShowNotification $ messagetitle $ message a přidejte funkci:

Funkce ShowNotification ($ MsgTitle, $ MsgText)
Add-Type -AssemblyName System.Windows.Forms
$ global: balmsg = New-Object System.Windows.Forms.NotifyIcon
$ path = (Get-Process -id $ pid) .Path
$ balmsg.Icon = [System.Drawing.Icon] :: ExtractAssociatedIcon ($ path)
$ balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon] :: Upozornění
$ balmsg.BalloonTipText = $ MsgText
$ balmsg.BalloonTipTitle = $ MsgTitle
$ balmsg.Visible = $ true
$ balmsg.ShowBalloonTip (10000)

E-mailová upozornění můžete také přidat pomocí Send-MailMessage..

Výsledkem je, že pokud jsou detekovány certifikáty s ukončenou platností nebo s ukončenou platností, budete upozorněni dopisem a vyskakovací zprávou.

Zbývá vytvořit automatickou úlohu plánovače, která by měla být provedena 1-2krát týdně, a spustit skript PowerShell pro kontrolu doby platnosti certifikátů webu HTTPS (můžete vytvořit úlohu plánovače pro spuštění souboru PS1 pomocí Register-ScheduledTask).

Vyhledejte certifikáty, jejichž platnost vyprší, v úložišti certifikátů Windows

Možná budete také potřebovat skript, který bude sledovat dobu platnosti certifikátů používaných pro kryptografické služby na serverech (například certifikáty na RDS, Exchange, SharePoint, LDAPS atd.) Nebo na uživatelských počítačích..

V místním počítači můžete získat seznam certifikátů, jejichž platnost brzy vyprší pomocí příkazu Get-ChildItem -Path cert. Powershell 3.0 má zvláštní argument -ExpiringInDays:

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

V PowerShell 2.0 vypadá podobný příkaz takto:

Get-ChildItem -Path cert: -Recurse | kde $ _. notafter -le (get-date) .AddDays (30) -AND $ _. notafter -gt (get-date) | vyberte miniaturu, předmět

Chcete-li zkontrolovat pouze své vlastní certifikáty, použijte kontejner Cert: \ LocalMachine \ My místo kořene Cert:. Tímto způsobem nebudete kontrolovat kořenové certifikáty Windows a komerční certifikáty.

Chcete-li najít certifikáty, které vyprší během následujících 30 dnů na všech serverech v doméně, můžete použít následující skript PowerShell:

$ servery = (get-adcomputer -LDAPFilter "(& (objectCategory = computer) (operationSystem = Windows Server *) (! serviceprincipalname = * MSClusterVirtualServer *) (! (userAccountControl: 1.2.840.113556.1.4.803: = 2))))) ") .Name
$ result = @ ()
foreach ($ server v $ serverech)

$ ErrorActionPreference = "SilentlyContinue"
$ getcert = Invoke-Command -ComputerName $ server Get-ChildItem -Path Cert: \ LocalMachine \ My -Recurse -ExpiringInDays 30
foreach ($ cert in $ getcert)
$ result + = New-Object -TypeName PSObject -Property ([objednáno] @
'Server' = $ server;
'Certificate' = $ cert.Issuer;
'Expires' = $ cert.NotAfter
)


Výsledek $ Write-Output $

Na serverech tedy obdržíte seznam certifikátů, jejichž platnost vyprší, a budete mít dostatek času na jejich obnovení.