Проверка даты истечения срока действия сертификата SSL/TLS с помощью PowerShell
Неожиданное истечение срока действия сертификата сервера может вызвать ряд проблем у ваших пользователей и клиентов: они не смогут установить безопасное соединение с вашим сайтом, могут возникнуть ошибки аутентификации, в браузере могут появиться надоедливые уведомления и т.д. В статье мы покажем, как проверить дату истечения срока действия сертификата SSL/TLS на удаленных сайтах или получить список сертификатов с истекающим сроком действия в локальном хранилище сертификатов на серверах или компьютерах вашего домена.
Получите дату истечения срока действия SSL-сертификата веб-сайта с помощью PowerShell
Многие веб-проекты используют бесплатные SSL-сертификаты Let’s Encrypt для реализации HTTPS. Эти сертификаты выдаются на 90 дней и должны регулярно продлеваться. Обычно сертификаты Let’s Encrypt на стороне хостинга или сервера обновляют специальные скрипты или боты (это может быть WACS в Windows или Certbot в Linux). Однако иногда автоматическое продление сертификата не удается. Я хотел бы иметь свой собственный скрипт, который проверял бы даты истечения срока действия SSL-сертификатов на веб-сайтах и уведомлял бы меня, когда срок их действия истекает. Для его создания я использовал PowerShell. Поскольку мы проверяем сертификат веб-сайта с помощью запроса HttpWeb, нам не нужны права администратора на удаленном веб-сайте/сервере.
В следующем скрипте PowerShell вы должны указать список веб-сайтов, на которых вы хотите проверить даты истечения срока действия сертификата, и возраст сертификата, когда вам начнет отображаться соответствующее уведомление (
$minCertAge). Я ввел 80 дней в качестве примера.
$minCertAge = 80
$timeoutMs = 10000
$sites = @(
"https://testsite1.com/",
"https://testsite2.com/",
"https://active-directory.ru/"
)
# Disable certificate validation
[Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
foreach ($site in $sites)
{
Write-Host Check $site -f Green
$req = [Net.HttpWebRequest]::Create($site)
$req.Timeout = $timeoutMs
try {$req.GetResponse() |Out-Null} catch {Write-Host URL check error $site`: $_ -f Red}
$expDate = $req.ServicePoint.Certificate.GetExpirationDateString()
$certExpDate = [datetime]::ParseExact($expDate, “dd/MM/yyyy HH:mm:ss”, $null)
[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 The $site certificate expires in $certExpiresIn days [$certExpDate] -f Green}
else
{
$message= "The $site certificate expires in $certExpiresIn days"
$messagetitle= "Renew certificate"
Write-Host $message [$certExpDate]. Details:`n`nCert name: $certName`Cert thumbprint: $certThumbprint`nCert effective date: $certEffectiveDate`nCert issuer: $certIssuer -f Red
#Displays a pop-up notification and sends an email to the administrator
#ShowNotification $messagetitle $message
# Send-MailMessage -From powershell@active-directory.ru -To admin@active-directory.ru -Subject $messagetitle -body $message -SmtpServer gwsmtp.active-directory.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)
}Вы также можете отправить уведомление по электронной почте, используя
Send-MailMessageЗатем, если будут обнаружены просроченные или истекающие сертификаты, вы получите уведомление по электронной почте и всплывающее сообщение.
Затем создайте автоматическую задачу для планировщика задач, которая будет запускаться один или два раза в неделю, и запустите сценарий PowerShell, чтобы проверить даты истечения срока действия сертификатов вашего веб-сайта HTTPS. (Вы можете создать задачу в планировщике задач для запуска файла сценария PS1 с помощью командлета Register-ScheduledTask.)
Как удаленно проверить наличие просроченных сертификатов в хранилище сертификатов Windows?
Вам также может потребоваться сценарий PowerShell для проверки сроков действия сертификатов, используемых криптографическими службами на серверах вашего домена (например, RDP/RDS, Exchange, SharePoint, LDAPS сертификаты и т. д.) или компьютерах пользователей.
На локальном компьютере получить список сертификатов можно командой:
Get-ChildItem -Path certPowershell 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Вы получите список сертификатов сервера, срок действия которых истекает, и у вас будет достаточно времени, чтобы обновить их.


