Отслеживание даты истечения CRL

Обновлено 24.06.2022

crl logo

Добрый день! Уважаемые читатели IT блога Pyatilistnik.org. В прошлый раз мы с вами "Как убрать надпись Активация Windows", напоминаю, это такой водяной знак, когда вы не ввели свой лицензионный ключ. Сегодня я хочу с вами поделиться методом, который позволит отслеживать и уведомлять, о дате, когда нужно перевыпускать список отозванных сертификатов на рутовом центре сертификации. Я покажу удобный PowerShell скрипт, так что будет полная автоматизация.

Описание задачи

В очередной раз в техническую поддержку обратился пользователь, что он не смог выпустить сертификат, ошибка была знакомая:

Произошла ошибка при регистрации сертификата. Не удается создать запрос сертификата. Ошибка: Невозможно проверить функцию отзыва, т.к. сервер отзыва сертификатов недоступен. 0x80092013 (-2146885613 CRYPT_E_REVOCATION_OFFLINE)

Невозможно проверить функцию отзыва

Данная ошибка сообщает, что у выпускающего CA нет возможности проверить список отзыва CRL от корневого центра сертификации, он просрочился.

Как отслеживать дату обновления CRL

Когда вы заходите в состав сертификата вашего издающего CA, то на поле "Точки распространения списка отзыва (CRL -CertificateRevocationList)" вы можете увидеть до него путь, как в моем примере.

Просмотр адреса CRL

Скопируйте путь, в результате у вас будет скачан CRL файл в котором вы сможете увидеть срок его действия и дату следующего обновления, ее то мы и будим получать.

 

Чтобы это реализовать в PowerShell нам нужно установить библиотеку Mono.Security.dll.

Скачать пакет с библиотекой Mono.Security.dll - https://www.mono-project.com/download/stable/

Или вы можете скачать Mono 6.2 у меня


Пакет Mono

После установки в каталоге C:\Program Files\Mono\lib\mono\4.5 будет находиться библиотека Mono.Security.dll. Ее нужно будет куда то-то положить в удобное место для использования, я копирую в папку со скриптом или же запомнить путь.

Текст скрипта PowerShell

Что делает данный скрипт:

  • 1️⃣Задает красивую дату для отображения журналов логов
  • 2️⃣Создает папку для логов если ее нет и будет вести лог туда
  • 3️⃣Указывает путь к библиотеке Mono.Security.dll
  • 4️⃣Задает адрес CRL который нужно проверять
  • 5️⃣Проверяет дату и уведомляет, о ее истечении за 10 дней
  • 6️⃣Отправляет отчет на почту
  • 7️⃣Отправляет уведомление в чат Telegram

Проверять удобно в PowerShell ISE. Убедитесь, что вы поменяли настройки почтового сервера на свои, доступ к группе в Telegram.

# Разработчик скрипта Иван Сёмин/Pyatilistnik.org (Копирование на сторонние ресурсы запрещено)
# Настраиваем формат времени

function Date {Get-Date -Format "yyyy.MM.dd HH:mm:ss"}

# Указываем куда будут создаваться логи при выполнении скрипта

$log_folder = "$PSScriptRoot\Logs\" + $($MyInvocation.MyCommand.Name -replace (".ps1", ""))
$log = "$log_folder\$(Get-Date -Format "yyyy_MM_dd_HH_mm_ss").txt"

if (! (Test-Path $log_folder -PathType Container -ErrorAction SilentlyContinue))
{
New-Item $log_folder -ItemType D -Force | Out-Null
}

# Указываем путь к библиотеке

"$(Date) Start Processing" | Tee-Object $log -Append

$Mono_Security_dll = "$PSScriptRoot\Mono.Security.dll"

"$(Date) Trying to import `"$Mono_Security_dll`"" | Tee-Object $log -Append

try {
Add-Type -Path "$PSScriptRoot\Mono.Security.dll" -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}

# Адрес CRL который нужно проверять

$crl_uri = "http://wca.pyatilistnik.org/RCA01.crl"
$crl_file = "$log_folder\RCA01.crl"

"$(Date) Trying to download CRL from `"$crl_uri`" to `"$crl_file`"" | Tee-Object $log -Append

try {
Invoke-WebRequest -Uri $crl_uri -OutFile $crl_file -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}

# Уведомление будет идти за 10 дней до истечения времени

"$(Date) Processing `"$crl_file`"" | Tee-Object $log -Append

$CRL = [Mono.Security.X509.X509Crl]::CreateFromFile($crl_file)

$TimeSpan = $null
$TimeSpan = (New-TimeSpan -Start $(Get-Date) -End $CRL.NextUpdate).Days

"$(Date) CRL $crl_uri will expire in $TimeSpan days" | Tee-Object $log -Append

# Кому отправлять на почту уведомление

if ($TimeSpan -le 10)
{
$from = "tech_notify@techmail.pyatilistnik.org"
$to = "admins@pyatilistnikdmins@pyatilistnik.org" # "semin@pyatilistnik.org" # "ivan@pyatilistnik.org" #

$Subject = "CRL $crl_uri will expire in $TimeSpan days"
$smtpserver = "techmail.pyatilistnik.org"
$secure = $true
$port = 587 # TLS, for SSL use 465
$username = "tech_notify"
$password = 'Password'

$body = "CRL $crl_uri will expire in $TimeSpan days"

$body += "<p>Generated on $($env:COMPUTERNAME + "." + $((Get-WmiObject Win32_ComputerSystem).Domain))"

$message = New-Object System.Net.Mail.MailMessage
$message.From = $from
$message.To.Add($to)
$message.Subject = $Subject
$message.Body = $body
$message.IsBodyHtml = $true

$smtp = New-Object Net.Mail.SmtpClient($smtpserver, $port)
$smtp.EnableSsl = $secure
$smtp.Credentials = New-Object System.Net.NetworkCredential($username, $password)

"$(Date) Trying to send e-mail notification" | Tee-Object $log -Append

try {
$smtp.Send($message)
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}

# Отправка в группу Telegram

"$(Date) Trying to send Telegram notification" | Tee-Object $log -Append

try {
$token = "668697434:AAF2iRrQ44444444444XUbeygug"
$chat_id = "-10014345555538"
$text = "CRL $crl_uri will expire in $TimeSpan days"

$payload = @{
"chat_id" = $chat_id;
"text" = $text;
"parse_mode" = "Markdown";
}

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

Invoke-WebRequest -Uri ("https://api.telegram.org/bot{0}/sendMessage" -f $token) -Method Post -ContentType "application/json;charset=utf-8" -Body (ConvertTo-Json -Compress -InputObject $payload) -ErrorAction Stop
}
catch {
"$(Date) $($_.exception.message)" | Tee-Object $log -Append
}
}

###

"$(Date) End Processing" | Tee-Object $log -Append

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

Письмо с датой истечения CRL

В телеге будет такое сообщение.

telegram уведомление CRL

Надеюсь, что было полезно. С вами был Иван Сёмин, автор и создатель IT портала Pyatilistnik.org.

Автор - Сёмин Иван

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *