PowerShell перевірка і оповіщення про закінчення терміну дії SSL сертифікату

Несподіване закінчення строку дії сертифіката сервера може викликати ряд неприємних наслідків для ваших клієнтів: неможливість встановити безпечне підключення, помилки аутентифікації, настирливі попередження в браузері і т.д. У цій статті ми покажемо, як за допомогою PowerShell перевірити термін дії SSL / TLS сертифікатів на віддалених сайтах, а також стікали сертифікатах в сховищах сертифікатів на серверах і комп'ютерах домену.

зміст:

  • Перевірка терміну дії SSL сертифікату на веб-сайтах в Інтернеті за допомогою PowerShell
  • Пошук стікали сертифікатів в сховище сертифікатів Windows

Перевірка терміну дії SSL сертифікату на веб-сайтах в Інтернеті за допомогою PowerShell

Нещодавно сайт https://winitpro.ru/ був перекладений протокол HTTPS за допомогою безкоштовного SSL сертифікату від Let's Encrypt. Особливість цих сертифікатів - вони видаються на термін 90 днів, після чого їх треба оновити (продовжити). Зазвичай продовження Let's Encrypt сертифікатів виконується спеціальними скриптами або ботами на стороні хостингу або сервера (в Windows це може бути WACS, в Linux - Certbot). Але іноді автоматика може дати збій. Мені хотілося б мати власну систему перевірки та оповіщення про закінчення терміну дії SSL сертифікатів на сайтах. Я реалізував її на PowerShell. Оскільки ми перевіряємо сертифікат сайту через HttpWeb запит, вам не потрібні права адміністратора на віддаленому веб-сайті / сервері.

У наступному PowerShell скрипті потрібно вказати список сайтів, на яких потрібно перевіряти термін дії сертифіката, а також за скільки днів до закінчення дії сертифіката починати показувати повідомлення ($ minCertAge). Як приклад я вказав 80 днів.

$ MinCertAge = 80
$ TimeoutMs = 10000
$ Sites = @ (
"Https://winitpro.ru",
"Https://site1.com/",
"Https://site2.ru/"
)
# Відключити перевірку коректності сертифікату
[Net.ServicePointManager] :: ServerCertificateValidationCallback = $ true
foreach ($ site in $ sites)

Write-Host Перевірка $ site -f Green
$ Req = [Net.HttpWebRequest] :: Create ($ site)
$ Req.Timeout = $ timeoutMs
try $ req.GetResponse () | Out-Null catch Write-Host Не вдалося перевірити URL $ site ': $ _ -f Red
[Datetime] $ certExpDate = $ req.ServicePoint.Certificate.GetExpirationDateString ()
[Int] $ certExpiresIn = ($ certExpDate - $ (get-date)). Days
$ CertName = $ req.ServicePoint.Certificate.GetName ()
$ CertThumbprint = $ req.ServicePoint.Certificate.GetCertHashString ()
$ CertEffectiveDate = $ req.ServicePoint.Certificate.GetEffectiveDateString ()
$ CertIssuer = $ req.ServicePoint.Certificate.GetIssuerName ()
if ($ certExpiresIn -gt $ minCertAge)
Write-Host Сертифікат для сайту $ site закінчиться через $ certExpiresIn днів [$ certExpDate] -f Green
else

$ Message = "Сертифікат для сайту $ site закінчиться через $ certExpiresIn днів"
$ Messagetitle = "Продовжити сертифікат"
Write-Host $ message [$ certExpDate]. Подробиці: 'n'nCert name: $ certName'Cert thumbprint: $ certThumbprint'nCert effective date: $ certEffectiveDate'nCert issuer: $ certIssuer -f Red
# Вивести спливаюче повідомлення і відправити лист Администартор
#ShowNotification $ messagetitle $ message
# Send-MailMessage -From [email protected] -To [email protected] -Subject $ messagetitle -body $ message -SmtpServer smtp.winitpro.ru -Encoding UTF8

write-host "________________" 'n

Даний PowerShell скрипт перевірить SSL сертифікати для всіх сайтів зі списку. Якщо виявиться сертифікат, який скоро прострочив, він буде виділ в попередженні.

Для оповіщення адміністратора про наближення терміну закінчення SSL сертифікату можна додати спливаюче повідомлення. Для цього раськоментіруйте рядок ShowNotification $ messagetitle $ message і додайте функцію:

Function 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] :: Warning
$ Balmsg.BalloonTipText = $ MsgText
$ Balmsg.BalloonTipTitle = $ MsgTitle
$ Balmsg.Visible = $ true
$ Balmsg.ShowBalloonTip (10000)

Також можна додати і email сповіщення за допомогою Send-MailMessage.

В результаті при виявленні прострочених або стікали сертифікатів ви будете повідомлені листом і спливаючих повідомленням

Залишилося створити автоматичне завдання планувальника, які має виконуватися 1-2 рази в тиждень і запускати PowerShell скрипт перевірки терміну дії сертифікатів HTTPS сайтів (ви можете створити завдання планувальника для запуску PS1 файлу за допомогою Register-ScheduledTask).

Пошук стікали сертифікатів в сховище сертифікатів Windows

Також вам може знадобиться скрипт, який буде моніторити термін дії сертифікатів, які використовуються для криптографічних службах на серверах (наприклад сертифікати на RDS, Exchange, SharePoint, LDAPS і т.д) або комп'ютерах користувачів.

На локальному комп'ютері ви можете отримати список сертифікатів, які скоро прострочать за допомогою команди Get-ChildItem -Path cert. У Powershell 3.0 є спеціальний аргумент -ExpiringInDays:

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

У PowerShell 2.0 аналогічна команда виглядає так:

Get-ChildItem -Path cert: -Recurse | where $ _. notafter -le (get-date) .AddDays (30) -AND $ _. notafter -gt (get-date) | select thumbprint, subject

Щоб перевірити тільки власні сертифікати використовуйте контейнер Cert: \ LocalMachine \ My замість кореневого Cert:. Так ви не будете перевіряти кореневі сертифікати Windows і комерційні сертифікати.

Щоб знайти сертифікати, які закінчуються на протязі наступних 30 днів на всіх серверах домена, можна використовувати такий PowerShell скрипт:

$ Servers = (get-adcomputer -LDAPFilter "(& (objectCategory = computer) (operatingSystem = Windows Server *) (! Serviceprincipalname = * MSClusterVirtualServer *) (! (UserAccountControl: 1.2.840.113556.1.4.803: = 2))) ") .Name
$ Result = @ ()
foreach ($ server in $ servers)

$ 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 ([ordered] @
'Server' = $ server;
'Certificate' = $ cert.Issuer;
'Expires' = $ cert.NotAfter
)


Write-Output $ result

Отже, ви отримаєте список стікали сертифікатів на серверах і у вас буде достатньо часу для їх продовження.