Несподіване закінчення строку дії сертифіката сервера може викликати ряд неприємних наслідків для ваших клієнтів: неможливість встановити безпечне підключення, помилки аутентифікації, настирливі попередження в браузері і т.д. У цій статті ми покажемо, як за допомогою 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
$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 powershell@winitpro.ru -To admin@winitpro.ru -Subject $messagetitle -body $message -SmtpServer smtp.winitpro.ru -Encoding UTF8
}
write-host "________________" `n
}

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

powerhell скрипт для перевірки стікали SSL сертифікатів на HTTPS сайтах

Для оповіщення адміністратора про наближення терміну закінчення 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.

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

повідомлення windows про просрачівающемся СЕРТФІКАТА

Залишилося створити автоматичне завдання планувальника, які має виконуватися 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:LocalMachineMy замість кореневого 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:LocalMachineMy -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

powerhsell скрипт для пошуку СЕРТФІКАТА, які скоро прострочать на комп'ютерах домену

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

Leave a Reply

Your email address will not be published. Required fields are marked *