Comprobación de la fecha de caducidad del certificado SSL/TLS con PowerShell
Un vencimiento inesperado 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 comprobar la fecha de caducidad de un certificado SSL/TLS en sitios remotos, u obtener una lista de los certificados que caducan en el almacén de certificados local de los servidores o equipos de su dominio.
Obtener la fecha de caducidad de un certificado SSL de sitio web con PowerShell
Muchos proyectos web utilizan certificados SSL gratuitos de Let's Encrypt para implementar HTTPS. Estos certificados se emiten durante 90 días y deben renovarse periódicamente. Por lo general, los scripts especiales o los bots actualizan los certificados de 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 caducidad de los certificados SSL en los sitios web y me notifique cuando estén a punto de caducar. 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 se le comience a mostrar la notificación correspondiente (
$minCertAge). Ingresé 80 días como ejemplo.
$minCertAge = 80
$timeoutMs = 10000
$sites = @(
"https://testsite1.com/",
"https://testsite2.com/",
"https://a-d.site/"
)
# 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@a-d.site -To admin@a-d.site -Subject $messagetitle -body $message -SmtpServer gwsmtp.a-d.site -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 script "
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-MailMessageLuego, si se encuentran certificados caducados o que caducan, se le notificará mediante un 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 buscar certificados caducados en el almacén de certificados de Windows de forma remota?
Es posible que también necesite un script de PowerShell para verificar 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 las computadoras de los usuarios.
En una computadora local, puede obtener una lista de certificados usando el comando:
Get-ChildItem -Path certPowershell 3.0 tiene un especial
-ExpiringInDays
argumento:
Get-ChildItem -Path cert: -Recurse -ExpiringInDays 30En 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, subjectPara comprobar sólo sus propios certificados, utilice el
Cert:\LocalMachine\Mycontenedor 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 buscar certificados que vencerá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:\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 $resultObtendrá la lista de certificados de servidor que están a punto de caducar y tendrá tiempo suficiente para renovarlos.


