Verificación de la fecha de vencimiento del certificado SSL / TLS con PowerShell

Una expiración inesperada de un certificado de servidor puede causar una serie de problemas para sus usuarios y clientes: es posible que no puedan establecer una conexión segura con su sitio, pueden ocurrir errores de autenticación, pueden aparecer notificaciones molestas en un navegador, etc. En este artículo, le mostraremos cómo verificar la fecha de vencimiento de un certificado SSL / TLS en sitios remotos u obtener una lista de certificados que vencen en el almacén de certificados local en los servidores o computadoras de su dominio.

Contenido:

  • Obtenga la fecha de vencimiento de un certificado SSL de sitio web con PowerShell
  • ¿Cómo verificar los certificados caducados en el almacén de certificados de Windows de forma remota?

Obtenga la fecha de vencimiento de un certificado SSL de sitio web con PowerShell

Muchos proyectos web utilizan certificados SSL Let’s Encrypt gratuitos para implementar HTTPS. Estos certificados son problemas para 90 días y debe renovarse periódicamente. Por lo general, los scripts o bots especiales actualizan los certificados Let’s Encrypt en el lado del servidor o del alojamiento (puede ser WACS en Windows o Certbot en Linux). Sin embargo, a veces falla la renovación automática del certificado. Me gustaría tener mi propio script que verifique las fechas de vencimiento del certificado SSL en los sitios web y me notifique cuando estén a punto de vencer. Usé PowerShell para crearlo. Dado que estamos verificando el certificado de un sitio web a través de una consulta HttpWeb, no necesitamos privilegios de administrador en un sitio web / servidor remoto.

En el siguiente script de PowerShell, debe especificar la lista de sitios web en los que desea verificar las fechas de vencimiento del certificado y la antigüedad del certificado cuando la notificación correspondiente comienza a mostrarse ($minCertAge). Ingresé 80 días como ejemplo.

$minCertAge = 80
$timeoutMs = 10000
$sites = @(
"https://testsite1.com/",
"https://testsite2.com/",
"https://woshub.com/"
)
# 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@woshub.com -To admin@woshub.com -Subject $messagetitle -body $message -SmtpServer gwsmtp.woshub.com -Encoding UTF8
}
write-host "________________" `n
}

Este script de PowerShell comprobará los certificados SSL de todos los sitios web de la lista. Si se encuentra un certificado que está a punto de caducar, se resaltará en la notificación.

Para notificar a un administrador que un certificado SSL está a punto de caducar, puede agregar una notificación emergente. Para hacerlo, descomente la línea de secuencia de comandos «ShowNotification $messagetitle $message”Y agregue la siguiente función:

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)
}

También puede enviar una notificación por correo electrónico utilizando Send-MailMessage.

Luego, si se encuentran certificados vencidos o vencidos, se le notificará por correo electrónico y un mensaje emergente.

Luego, cree una tarea automática para que el Programador de tareas se ejecute una o dos veces por semana y ejecute el script de PowerShell para verificar las fechas de vencimiento de los certificados de su sitio web HTTPS. (Puede crear una tarea en el Programador de tareas para ejecutar un archivo de secuencia de comandos de PS1 mediante el cmdlet Register-ScheduledTask).

¿Cómo verificar los certificados caducados en el almacén de certificados de Windows de forma remota?

Es posible que también necesite un script de PowerShell que verifique las fechas de vencimiento de los certificados utilizados por los servicios criptográficos en los servidores de su dominio (por ejemplo, RDP / RDS, Exchange, SharePoint, certificados LDAPS, etc.) o en las computadoras de los usuarios.

En una computadora local, puede obtener una lista de certificados usando el comando:

Get-ChildItem -Path cert

Powershell 3.0 tiene un especial -ExpiringInDays argumento:

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

En PowerShell 2.0, el mismo comando se ve así:

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

Para comprobar solo sus propios certificados, utilice el Cert:LocalMachineMy contenedor en lugar de Cert: en la carpeta raíz. Por lo tanto, no comprobará los certificados raíz de confianza de Windows ni los certificados comerciales.

Para encontrar certificados que caducarán en los próximos 30 días en todos los servidores de dominio, use este script de 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

Escanee el almacén de certificados de Windows en busca de certificados que caduquen de forma remota utilizando powershell

Obtendrá la lista de certificados de servidor que están a punto de caducar y tendrá tiempo suficiente para renovarlos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *