Утвърждаване на PowerShell и известяване на изтичане на сертификата за SSL

Неочакваното изтичане на срока на сертификата на сървъра може да доведе до редица неприятни последици за вашите клиенти: невъзможност за установяване на защитена връзка, грешки при удостоверяване, досадни предупреждения в браузъра и др. В тази статия ще покажем как да използваме PowerShell за проверка на изтичането на SSL / TLS сертификатите на отдалечени сайтове, както и на изтичащите сертификати в сертификатните магазини на сървъри и компютри с домейни.

Съдържание:

  • Проверете стойностите на сертификата за SSL на уеб сайтове, използвайки PowerShell
  • Търсете изтичащи сертификати в магазина за сертификати на Windows

Проверете стойностите на сертификата за SSL на уеб сайтове, използвайки PowerShell

Наскоро сайтът https://winitpro.ru/ беше прехвърлен към протокола HTTPS с помощта на безплатен SSL сертификат от Нека да шифроваме. Особеността на тези сертификати е, че те се издават за период от 90 дни, след което те трябва да бъдат актуализирани (подновени). Обикновено подновяването на сертификати Let's Encrypt се извършва от специални скриптове или ботове на хостинг или сървър страна (в Windows може да е WACS, на Linux Certbot). Но понякога автоматизацията може да се провали. Бих искал да имам собствена система за проверка и уведомяване за изтичане на SSL сертификатите в сайтовете. Приложих го на PowerShell. защото проверяваме сертификата на сайта чрез HttpWeb заявка, нямате нужда от администраторски права на отдалечения уебсайт / сървър.

В следващия скрипт на PowerShell трябва да посочите списък със сайтове, на които искате да проверите периода на валидност на сертификата, както и колко дни преди изтичането на сертификата, за да започнете да показвате известия ($ minCertAge). Като пример посочих 80 дни.

$ minCertAge = 80
$ timeoutMs = 10000
$ сайтове = @ (
"Https://winitpro.ru",
"Https://site1.com/",
"Https://site2.ru/"
)
# Деактивиране на валидирането на сертификат
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ сайт в $ сайтове)

Напишете-проверете домакин на $ site -f Green
$ req = [Net.HttpWebRequest] :: Създаване ($ сайт)
$ req.Timeout = $ timeoutMs
опитайте $ req.GetResponse () | Out-Null улов Write-Host URL error validation $ $ ': $ _ -f Red
[datetime] $ certExpDate = $ req.ServicePoint.Certificate.GetExpirationDateString ()
[int] $ certExpiresIn = ($ certExpDate - $ (дата на получаване)). Дни
$ certName = $ req.ServicePoint.Certificate.GetName ()
$ certThumbprint = $ req.ServicePoint.Certificate.GetCertHashString ()
$ certEffectiveDate = $ req.ServicePoint.Certificate.GetEffectiveDateString ()
$ certIssuer = $ req.ServicePoint.Certificate.GetIssuerName ()
if ($ certExpiresIn -gt $ minCertAge)
Сертификатът за запис на хост за $ сайт изтича след $ certExpiresв дни [$ certExpDate] -f Green
още

$ message = "Сертификатът за сайта на сайта $ изтича след $ certExpiresIn дни"
$ messagetitle = "Подновяване на сертификата"
$ Message за запис [$ certExpDate]. Подробности: 'n'nCert име: $ certName'Cert thumbprint: $ certThumbprint'nCert дата на влизане в сила: $ certEffectiveDate'nCert издател: $ certIssuer -f Red
# показване на изскачащо известие и изпращане на писмо до администратора
#ShowNotification $ messagetitle $ message
# Изпращане на MailMessage -от [email protected] -До администратора@winitpro.ru -Subject $ messagetitle -body $ message -SmtpServer smtp.winitpro.ru -Енкодиране UTF8

write-host "________________" 'n

Този скрипт на PowerShell ще проверява SSL сертификатите за всички сайтове от списъка. Ако бъде открит сертификат, който изтича скоро, той ще бъде подчертан с предупреждение.

За да уведомите администратора за предстоящото изтичане на SSL сертификата, можете да добавите изскачащо известие. За да направите това, коментирайте реда ShowNotification $ messagetitle $ message и добавете функция:

Функция 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] :: Предупреждение
$ balmsg.BalloonTipText = $ MsgText
$ balmsg.BalloonTipTitle = $ MsgTitle
$ balmsg.Visible = $ true
$ balmsg.ShowBalloonTip (10000)

Можете също да добавяте известия по имейл чрез Send-MailMessage..

В резултат на това, ако бъдат открити изтичащи или изтичащи срокове сертификати, ще бъдете уведомени с писмо и изскачащо съобщение.

Остава да създадете задача за автоматичен планировчик, която трябва да се изпълнява 1-2 пъти седмично и да стартирате PowerShell скрипт за проверка на периода на валидност на сертификатите на сайта на HTTPS (можете да създадете задача за планиране на стартиране на PS1 файл с помощта на Register-ScheduledTask).

Търсете изтичащи сертификати в магазина за сертификати на Windows

Може да ви е необходим и скрипт, който ще следи периода на валидност на сертификатите, използвани за криптографски услуги на сървъри (например сертификати на RDS, Exchange, SharePoint, LDAPS и т.н.) или потребителски компютри.

На локалния компютър можете да получите списък със сертификати, които ще изтекат скоро с помощта на командата Get-ChildItem -Part cert. Powershell 3.0 има специален аргумент -ExpiringInDays:

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

В PowerShell 2.0 подобна команда изглежда така:

Get-ChildItem -Path cert: -Recurse | където $ _. notafter -le (get-date) .AddDays (30) -AND $ _. notafter -gt (get-date) | изберете отпечатък, тема

За да проверите само вашите собствени сертификати, използвайте контейнер Cert: \ LocalMachine \ My вместо корен CERT:. По този начин няма да проверявате коренни сертификати и търговски сертификати на Windows.

За да намерите сертификати, които изтичат през следващите 30 дни на всички сървъри в даден домейн, можете да използвате следния скрипт PowerShell:

$ servers = (get-adcomputer -LDAPFilter "(& (objectCategory = компютър) (operaSystem = Windows Server *) (! serviceprincipalname = * MSClusterVirtualServer *) (! (userAccountControl: 1.2.840.113556.1.4.803: = 2)))) ") .Име
$ резултат = @ ()
foreach ($ сървър в $ сървъри)

$ ErrorActionPreference = "SilentlyContinue"
$ getcert = Invoke-Command -ComputerName $ server Get-ChildItem -Path Cert: \ LocalMachine \ My -Recurse -ExpiringInDays 30
foreach ($ cert в $ getcert)
$ result + = New-Object -TypeName PSObject -Property ([поръчано] @
'Server' = $ сървър;
'Сертификат' = $ cert.Issuer;
'Изтича' = $ cert.NotAfter
)


Резултат $ Write-Output

Така че ще получите списък с изтичащи сертификати на сървърите и ще имате достатъчно време да ги подновите.