Provjera valjanosti PowerShell-a i obavijest o isteku SSL certifikata

Neočekivani istek certifikata poslužitelja može uzrokovati niz neugodnih posljedica za vaše klijente: nemogućnost uspostavljanja sigurne veze, pogreške u autentifikaciji, dosadna upozorenja u pregledniku itd. U ovom ćemo članku pokazati kako koristiti PowerShell za provjeru isteka SSL / TLS certifikata na udaljenim web lokacijama, kao i isteklih certifikata u trgovinama certifikata na poslužiteljima i računalima domena.

sadržaj:

  • Vrijednosti SSL certifikata na web lokacijama pomoću PowerShell-a
  • Potražite istekle certifikate u trgovini certifikata za Windows

Vrijednosti SSL certifikata na web lokacijama pomoću PowerShell-a

Nedavno je stranica https://winitpro.ru/ prenesena na HTTPS protokol korištenjem besplatnog SSL certifikata iz Šifrirajmo. Posebnost ovih potvrda jest u tome što se izdaju na određeno vrijeme 90 dana, nakon čega ih je potrebno ažurirati (obnoviti). Obnavljanje certifikata Let Encrypt obično se vrši posebnim skriptama ili botovima na strani hostinga ili poslužitelja (na Windows-u to može biti WACS, na Linuxu Certbot). Ali ponekad automatizacija može uspjeti. Želio bih imati vlastiti sustav provjere i obavijesti o isteku SSL certifikata na web lokacijama. Proveo sam ga na PowerShellu. jer potvrđujemo potvrdu web mjesta putem HttpWeb zahtjeva, ne trebaju vam administratorska prava na udaljenoj web lokaciji / poslužitelju.

U sljedećoj PowerShell skripti morate navesti popis web lokacija na kojima želite provjeriti rok valjanosti certifikata, kao i koliko dana prije isteka certifikata kako biste počeli prikazivati ​​obavijesti ($ minCertAge). Kao primjer naveo sam 80 dana.

$ minCertAge = 80
$ timeoutMs = 10000
$ sites = @ (
"Https://winitpro.ru",
"Https://site1.com/",
"Https://site2.ru/"
)
# Onemogući provjeru valjanosti certifikata
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ site in $ sites)

Write-Host Check $ site -f Zeleno
$ req = [Net.HttpWebRequest] :: Stvori ($ web stranica)
$ req.Timeout = $ timeoutMs
pokušajte $ req.GetResponse () | Out-Null uhvatiti Write-Host URL validation error $ site ': $ _ -f Red
[datum] $ certExpDate = $ req.ServicePoint.Certificate.GetExpirationDateString ()
[int] $ certExpiresIn = ($ certExpDate - $ (datum-datum)). Dani
$ certName = $ req.ServicePoint.Certificate.GetName ()
$ certThumbprint = $ req.ServicePoint.Certificate.GetCertHashString ()
$ certEffectiveDate = $ req.ServicePoint.Certificate.GetEffectiveDateString ()
$ certIssuer = $ req.ServicePoint.Certificate.GetIssuerName ()
ako ($ certExpiresIn -gt $ minCertAge)
Certifikat Write-Host za $ site istječe za $ certExpiresIn days [$ certExpDate] -f Green
drugo

$ message = "Certifikat za web lokaciju $ istječe za $ certExpiresIn dana"
$ messagetitle = "Obnovi potvrdu"
$ Message za pisanje [$ certExpDate]. Pojedinosti: 'n'nCert ime: $ certName'Cert thumbprint: $ certThumbprint'nCert datum stupanja na snagu: $ certEffectiveDate'nCert izdavač: $ certIssuer -f Red
# prikazite skočnu obavijest i pošaljite pismo administratoru
#ShowNotification $ messagetitle $ poruka
# Send-MailMessage -Od [email protected] -Da [email protected] -Subject $ messagetitle -body $ message -SmtpServer smtp.winitpro.ru -Encoding UTF8

pisati-domaćin "________________" 'n

Ova skripta PowerShell provjerit će SSL certifikate za sve web lokacije s popisa. Ako se pronađe certifikat koji uskoro istječe, bit će istaknut u upozorenju.

Da biste obavijestili administratora o nadolazećem isteku SSL certifikata, možete dodati skočnu obavijest. Da biste to učinili, komentirajte liniju ShowNotification $ messagetitle $ message i dodajte funkciju:

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

Upozorenja putem e-pošte možete dodati i putem Send-MailMessage..

Kao rezultat toga, ako se otkriju istekli ili istekli certifikati, bit ćete obaviješteni pismom i skočnom porukom.

Ostaje stvoriti automatski raspored planera koji bi se trebao izvoditi 1-2 puta tjedno i pokrenuti PowerShell skriptu za provjeru razdoblja valjanosti HTTPS certifikata web mjesta (možete stvoriti zadatak planera za pokretanje PS1 datoteke pomoću Registriraj-ScheduledTask).

Potražite istekle certifikate u trgovini certifikata za Windows

Možda će vam trebati i skripta koja će pratiti razdoblje valjanosti certifikata koji se koriste za kriptografske usluge na poslužiteljima (na primjer, certifikati na RDS, Exchange, SharePoint, LDAPS, itd.) Ili korisnička računala.

Na lokalnom računalu možete dobiti popis certifikata koji će uskoro isteći pomoću naredbe Get-ChildItem-Potporni. Powershell 3.0 ima poseban argument -ExpiringInDays:

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

U PowerShellu 2.0 slična naredba izgleda ovako:

Get-ChildItem -Pred cert: -Recurse | gdje je $ _. notafter -le (get-date) .AddDays (30) -AND $ _. notafter -gt (get-date) | odaberite otisak prsta, predmet

Da biste provjerili samo svoje potvrde, koristite spremnik Cert: \ LocalMachine \ My umjesto korijena CERT:. Na ovaj način nećete provjeravati Windows root certifikate i komercijalne certifikate.

Da biste pronašli certifikate koji istječu u sljedećih 30 dana na svim poslužiteljima u domeni, možete koristiti sljedeću skriptu PowerShell:

$ serveri = (get-adcomputer -LDAPFilter "(& (objectCategory = računalo) (operativni sustav = Windows Server *) (! serviceprincipalname = * MSClusterVirtualServer *) (! (userAccountControl: 1.2.840.113556.1.4.803: = 2)))) "). Ime
$ rezultat = @ ()
foreach ($ poslužitelj u $ poslužiteljima)

$ ErrorActionPreference = "SilentlyContinue"
$ getcert = Invoke-Command -ComputerName $ server Get-ChildItem -Path Cert: \ LocalMachine \ My -Recurse -ExpiringInDays 30
foreach ($ cert u $ getcert)
$ result + = New-Object -TypeName PSObject -Project ([naručeno] @
'Server' = $ server;
'Potvrda' = $ cert.Issuer;
'Istječe' = $ cert.NotAfter
)


Rezultat ispisa $

Dakle, na poslužiteljima ćete dobiti popis isteklih certifikata i imat ćete dovoljno vremena da ih obnovite.