Overenie platnosti PowerShell a oznámenie o uplynutí platnosti certifikátu SSL

Neočakávané vypršanie platnosti certifikátu servera môže mať pre vašich klientov mnoho nepríjemných následkov: neschopnosť nadviazať bezpečné pripojenie, chyby autentifikácie, nepríjemné varovania v prehliadači atď. V tomto článku si ukážeme, ako používať PowerShell na overenie platnosti certifikátov SSL / TLS na vzdialených serveroch, ako aj na vypršanie platnosti certifikátov v skladoch certifikátov na serveroch a v doménach..

obsah:

  • Overte hodnoty certifikátov SSL na webových stránkach pomocou PowerShell
  • Vyhľadajte certifikáty, ktorých platnosť vyprší, v sklade certifikátov Windows

Overte hodnoty certifikátov SSL na webových stránkach pomocou PowerShell

Nedávno bol web https://winitpro.ru/ prevedený do protokolu HTTPS pomocou bezplatného certifikátu SSL od spoločnosti Poďme zašifrovať. Zvláštnosťou týchto osvedčení je, že sa vydávajú na obdobie do 90 dní, po ktorých je potrebné ich aktualizovať (obnoviť). Certifikáty Poďme šifrovať sa zvyčajne obnovujú pomocou špeciálnych skriptov alebo robotov na strane hostingu alebo servera (v systéme Windows to môže byť WACS, v systéme Linux - Certbot). Automatizácia však niekedy môže zlyhať. Chcel by som mať na stránkach vlastný systém overovania a oznamovania uplynutia platnosti certifikátov SSL. Implementoval som to na PowerShell. pretože overíme certifikát lokality prostredníctvom žiadosti HttpWeb, na vzdialenú webovú stránku / server nepotrebujete administrátorské práva.

V nasledujúcom skripte PowerShell musíte zadať zoznam lokalít, na ktorých chcete skontrolovať dobu platnosti certifikátu, a tiež počet dní pred uplynutím platnosti certifikátu, aby sa mohli začať zobrazovať upozornenia ($ minCertAge). Ako príklad som uviedol 80 dní.

$ minCertAge = 80
$ timeoutMs = 10000
$ sites = @ (
"Https://winitpro.ru",
"Https://site1.com/",
"Https://site2.ru/"
)
# Zakáže overenie certifikátu
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ site in $ sites)

Write-Host Skontrolujte $ site -f Green
$ req = [Net.HttpWebRequest] :: Create ($ site)
$ req.Timeout = $ timeoutMs
skúste $ req.GetResponse () | Out-Null chytiť Chyba pri overení adresy URL hostiteľa $ 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)
Certifikát typu Write-Host pre web $ vyprší o $ certExpiresV dňoch [$ certExpDate] -f Green
inak

$ message = "Platnosť certifikátu pre web $ $ vyprší o $ certExpiresv dňoch"
$ messagetitle = "Obnoviť certifikát"
Napíšte správu $ Host [$ certExpDate]. Podrobnosti: 'n'nCert name: $ certName'Cert thumbprint: $ certThumbprint'nCert date: $ certEffectiveDate'nCert emitent: $ certIssuer -f Red
# zobraziť kontextové upozornenie a poslať list správcovi
#ShowNotification $ messagetitle $ message
# Send-MailMessage -Od [email protected] -To [email protected] -Subject $ messagetitle -body $ message -SmtpServer smtp.winitpro.ru -Encoding UTF8

hostiteľ zápisu "________________" 'n

Tento skript PowerShell skontroluje certifikáty SSL pre všetky lokality zo zoznamu. Ak sa nájde certifikát, ktorý čoskoro vyprší, bude v upozornení zvýraznený.

Ak chcete upovedomiť správcu o blížiacom sa uplynutí platnosti certifikátu SSL, môžete pridať kontextové upozornenie. Urobíte to tak, že zrušíte označenie správy ShowNotification $ messagetitle $ a pridáte funkciu:

Funkcia 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 ($ cesta)
$ balmsg.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon] :: Warning
$ balmsg.BalloonTipText = $ MsgText
$ balmsg.BalloonTipTitle = $ MsgTitle
$ balmsg.Visible = $ true
$ balmsg.ShowBalloonTip (10 000)

E-mailové upozornenia môžete pridať aj pomocou funkcie Send-MailMessage..

Výsledkom je, že ak sa zistí platnosť certifikátov, ktorých platnosť uplynula alebo ich platnosť končí, dostanete upozornenie listom a kontextovou správou.

Zostáva vytvoriť automatickú úlohu plánovača, ktorá by sa mala vykonať 1-2 krát týždenne a spustiť skript PowerShell na kontrolu doby platnosti certifikátov lokality HTTPS (môžete vytvoriť úlohu plánovača na spustenie súboru PS1 pomocou Register-ScheduledTask).

Vyhľadajte certifikáty, ktorých platnosť vyprší, v sklade certifikátov Windows

Možno budete potrebovať aj skript, ktorý bude monitorovať dobu platnosti certifikátov používaných pre kryptografické služby na serveroch (napríklad certifikáty na serveroch RDS, Exchange, SharePoint, LDAPS atď.) Alebo na počítačoch používateľov..

Na lokálnom počítači môžete získať zoznam certifikátov, ktorých platnosť vyprší čoskoro pomocou príkazu Get-ChildItem -Path cert. Powershell 3.0 má špeciálny argument -ExpiringInDays:

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

V PowerShell 2.0 vyzerá podobný príkaz takto:

Get-ChildItem -Path cert: -Recurse | kde $ _. notafter -le (get-date) .AddDays (30) -AND $ _. notafter -gt (get-date) | vyberte miniatúru, predmet

Ak chcete skontrolovať iba svoje vlastné certifikáty, použite kontajner Cert: \ LocalMachine \ My namiesto koreňa cert:. Týmto spôsobom nebudete kontrolovať koreňové certifikáty Windows a komerčné certifikáty.

Ak chcete nájsť certifikáty, ktorých platnosť vyprší do nasledujúcich 30 dní na všetkých serveroch v doméne, môžete použiť nasledujúci 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 na $ serveroch)

$ 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 ([objednané] @
'Server' = $ server;
'Certificate' = $ cert.Issuer;
'Vyprší' = $ cert.NotAfter
)


Výsledok $ Write-Output $

Na serveroch dostanete zoznam certifikátov, ktorých platnosť vyprší, a budete mať dostatok času na ich obnovenie.