Preverjanje veljavnosti PowerShell in obveščanje o poteku SSL certifikata

Nepričakovani potek certifikata strežnika lahko za vaše stranke povzroči številne neprijetne posledice: nezmožnost vzpostavitve varne povezave, napake pri preverjanju pristnosti, moteča opozorila v brskalniku itd. V tem članku bomo pokazali, kako uporabiti PowerShell za preverjanje poteka certifikatov SSL / TLS na oddaljenih spletnih mestih, pa tudi o poteku potrdil v trgovinah s certifikati na strežnikih in domenskih računalnikih.

Vsebina:

  • Preverite vrednosti potrdil SSL na spletnih straneh z uporabo PowerShell-a
  • Poiščite potrdila, ki potečejo, v trgovini s certifikati Windows

Preverite vrednosti potrdil SSL na spletnih straneh z uporabo PowerShell-a

Nedavno je bilo spletno mesto https://winitpro.ru/ preneseno v protokol HTTPS z uporabo brezplačnega SSL potrdila Šifrirajmo. Posebnost teh potrdil je, da se izdajajo za obdobje od 90 dni, po katerih jih je treba posodobiti (obnoviti). Ponavadi obnovitve potrdil Let's Encrypt izvajajo posebni skripti ali boti na strani gostovanja ali strežnika (v sistemu Windows je lahko WACS, na Linux Certbot). Toda včasih avtomatizacija lahko odpove. Rad bi imel svoj sistem preverjanja in obveščanja o poteku SSL certifikatov na spletnih mestih. Izvedel sem ga na PowerShellu. Ker potrjujemo spletno potrdilo prek zahteve HttpWeb, na oddaljenem spletnem mestu / strežniku ne potrebujete skrbniških pravic.

V naslednjem skriptu PowerShell morate določiti seznam spletnih mest, na katerih želite preveriti obdobje veljavnosti certifikata, in tudi koliko dni pred iztekom potrdila, da začnete prikazovati obvestila ($ minCertAge). Kot primer sem navedel 80 dni.

$ minCertAge = 80
$ timeoutMs = 10000
$ sites = @ (
"https://winitpro.ru",
"https://site1.com/",
"https://site2.ru/"
)
# Onemogoči preverjanje veljavnosti certifikata
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ spletno mesto na $ spletnih mestih)

Write-Host Check $ site -f Green
$ req = [Net.HttpWebRequest] :: Ustvari ($ spletna stran)
$ req.Timeout = $ timeoutM
poskusite $ req.GetResponse () | Out-Null ujeti Napaka pri preverjanju veljavnosti URL-ja gostitelja $ site ': $ _ -f Red
[datetime] $ certExpDate = $ req.ServicePoint.Certificate.GetExpirationDateString ()
[int] $ certExpiresIn = ($ certExpDate - $ (dobite datum)).
$ certName = $ req.ServicePoint.Certificate.GetName ()
$ certThumbprint = $ req.ServicePoint.Certificate.GetCertHashString ()
$ certEffectiveDate = $ req.ServicePoint.Certificate.GetEffectiveDateString ()
$ certIssuer = $ req.ServicePoint.Certificate.GetIssuerName ()
če ($ certExpiresIn -gt $ minCertAge)
Potrdilo za pisanje gostitelja za spletno mesto $ poteče čez $ certExpiresIn dni [$ certExpDate] -f Green
drugače

$ message = "Potrdilo za spletno mesto $ stran poteče čez $ certExpiresIn dni."
$ messagetitle = "Obnovi potrdilo"
$ Message za pisanje [$ certExpDate]. Podrobnosti: 'n'nCert ime: $ certName'Cert thumbprint: $ certThumbprint'nCert veljaven datum: $ certEffectiveDate'nCert izdajatelj: $ certIssuer -f Red
# prikaže pojavno obvestilo in pošlje pismo administratorju
#ShowNotification $ messagetitle $ message
# Send-MailMessage -Od [email protected] -Pred [email protected] -Subject $ messagetitle -body $ message -SmtpServer smtp.winitpro.ru -Encoding UTF8

piši-gostitelj "________________" 'n

Ta skript PowerShell bo preveril SSL certifikate za vsa spletna mesta s seznama. Če je mogoče najti potrdilo, ki kmalu poteče, bo to označeno z opozorilom.

Če želite administratorja obvestiti o prihajajočem poteku SSL certifikata, lahko dodate pojavno obvestilo. Če želite to narediti, komentirajte vrstico ShowNotification $ messagetitle $ in dodajte funkcijo:

Funkcija ShowNotification ($ MsgTitle, $ MsgText)
Add-Type -AssemblyName System.Windows.Forms
$ global: balmsg = Nov objektni sistem.Windows.Forms.NotifyIcon
$ path = (Get-Process -id $ pid). Pot
$ balmsg.Icon = [System.Drawing.Icon] :: ExtractAssociatedIcon ($ pot)
$ balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon] :: Opozorilo
$ balmsg.BalloonTipText = $ MsgText
$ balmsg.BalloonTipTitle = $ MsgTitle
$ balmsg.Visible = $ true
$ balmsg.ShowBalloonTip (10000)

Opozorila po e-pošti lahko dodate tudi s funkcijo Send-MailMessage..

Posledično boste v primeru odkritja certifikatov, ki potečejo ali potečejo, obveščeni s pismom in pojavnim sporočilom.

Ostaja samo ustvarjanje naloge samodejnega načrtovalca, ki jo je treba izvesti 1-2 krat na teden in zaženite skript PowerShell za preverjanje veljavnosti potrdil spletnega mesta HTTPS (lahko ustvarite opravilo planerja za zagon datoteke PS1 s pomočjo Register-ScheduledTask).

Poiščite potrdila, ki potečejo, v trgovini s certifikati Windows

Morda boste potrebovali tudi skript, ki bo spremljal obdobje veljavnosti potrdil, ki se uporabljajo za kriptografske storitve na strežnikih (na primer potrdila na RDS, Exchange, SharePoint, LDAPS itd.) Ali uporabniške računalnike.

V lokalnem računalniku lahko dobite seznam potrdil, ki bodo kmalu potekli z uporabo ukaza Get-ChildItem-Pot cert. Powershell 3.0 ima poseben argument -Iztekajoči dnevi:

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

V PowerShell 2.0 je podoben ukaz videti takole:

Get-ChildItem-Pot cert: -Ponovite | kjer je $ _. notafter -le (get-datum) .AddDays (30) -AND $ _. notafter -gt (get-datum) | izberite odtis, zadevo

Če želite preveriti samo lastna potrdila, uporabite posodo Cert: \ LocalMachine \ My namesto korenine Cert:. Tako ne boste preverjali Windows korenskih potrdil in komercialnih potrdil.

Če želite najti potrdila, ki v naslednjih 30 dneh potečejo na vseh strežnikih domene, lahko uporabite naslednji skript PowerShell:

$ strežniki = (get-adcomputer -LDAPFilter "(& (objectCategory = računalnik) (operacijski sistem = Windows Server *) (! serviceprincipalname = * MSClusterVirtualServer *) (! (userAccountControl: 1.2.840.113556.1.4.803: = 2)))) "). Ime
$ rezultat = @ ()
foreach ($ strežnik v $ strežnikih)

$ ErrorActionPreference = "SilentlyContinue"
$ getcert = Invoke-Command -ComputerName $ server Get-ChildItem -Path Cert: \ LocalMachine \ My -Recurse -ExpiringInDays 30
foreach ($ cert v $ getcert)
$ result + = New-Object -TypeName PSObject -Property ([urejeno] @
'Strežnik' = $ strežnik;
'Potrdilo' = $ cert.Issuer;
'Poteče' = $ cert.NotAfter
)


Rezultat pisanja-izpisa $

Torej boste na strežnikih prejeli seznam veljavnih potrdil in imeli boste dovolj časa, da jih obnovite.