PowerShell ile SSL/TLS Sertifikası Son Kullanma Tarihini Kontrol Etme


Bir sunucu sertifikasının beklenmedik şekilde sona ermesi, kullanıcılarınız ve müşterileriniz için bir dizi soruna neden olabilir: sitenizle güvenli bir bağlantı kuramayabilirler, kimlik doğrulama hataları oluşabilir, tarayıcıda rahatsız edici bildirimler görünebilir vb. Makalemizde, uzak sitelerdeki bir SSL/TLS sertifikasının sona erme tarihinin nasıl kontrol edileceğini veya etki alanınızdaki sunuculardaki veya bilgisayarlardaki yerel sertifika deposunda süresi dolan sertifikaların bir listesini nasıl alacağınızı göstereceğiz.

PowerShell ile Web Sitesi SSL Sertifikasının Son Kullanma Tarihini Alın

Birçok web projesi, HTTPS'yi uygulamak için ücretsiz Let's Encrypt SSL sertifikaları kullanır. Bu sertifikalar 90 gün boyunca verilir ve düzenli olarak yenilenmelidir. Genellikle özel komut dosyaları veya botlar, barındırma veya sunucu tarafında Let's Encrypt sertifikalarını günceller (Windows'ta WACS veya Linux'ta Certbot olabilir). Ancak, bazen otomatik sertifika yenileme başarısız olur. Web sitelerindeki SSL sertifikası son kullanma tarihlerini kontrol edecek ve sona ermek üzereyken beni bilgilendirecek kendi komut dosyama sahip olmak istiyorum. Oluşturmak için PowerShell kullandım. Bir web sitesinin sertifikasını bir HttpWeb sorgusu aracılığıyla kontrol ettiğimiz için, uzak bir web sitesinde/sunucuda yönetici ayrıcalıklarına ihtiyacımız yok.

Aşağıdaki PowerShell betiğinde, sertifika son kullanma tarihlerini kontrol etmek istediğiniz web sitesinin listesini ve ilgili bildirimin size gösterilmeye başladığı sertifika yaşını belirtmelisiniz (

$minCertAge

). Örnek olarak 80 gün girdim.

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

Bu PowerShell betiği, listedeki tüm web sitelerinin SSL sertifikalarını kontrol edecektir. Süresi dolmak üzere olan bir sertifika bulunursa, bildirimde vurgulanacaktır.

Bir yöneticiye SSL sertifikasının süresinin dolmak üzere olduğunu bildirmek için açılır bir bildirim ekleyebilirsiniz. Bunu yapmak için komut dosyası satırının yorumunu kaldırın "

ShowNotification $messagetitle $message

” ve aşağıdaki işlevi ekleyin:

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

kullanarak bir e-posta bildirimi de gönderebilirsiniz.

Send-MailMessage

Ardından, süresi dolmuş veya sona ermekte olan sertifikalar bulunursa, bir e-posta ve bir açılır mesaj ile bilgilendirileceksiniz.

Ardından, Görev Zamanlayıcı'nın haftada bir veya iki kez çalıştırılması için otomatik bir görev oluşturun ve HTTPS web sitesi sertifikalarınızın son kullanma tarihlerini kontrol etmek için PowerShell betiğini çalıştırın. (Register-ScheduledTask cmdlet'i kullanarak bir PS1 komut dosyasını çalıştırmak için Görev Zamanlayıcı'da bir görev oluşturabilirsiniz.)

Windows Sertifika Deposunda Süresi Dolan Sertifikalar Uzaktan Nasıl Kontrol Edilir?

Ayrıca, alan sunucularınızda (ör. RDP/RDS , Exchange, SharePoint, LDAPS sertifikaları vb.) veya kullanıcıların bilgisayarlarında şifreleme hizmetleri tarafından kullanılan sertifikaların sona erme tarihlerini kontrol etmek için bir PowerShell komut dosyasına ihtiyacınız olabilir.

Yerel bir bilgisayarda, şu komutu kullanarak bir sertifika listesi alabilirsiniz:

Get-ChildItem -Path cert

Powershell 3.0'ın özel bir özelliği vardır

-ExpiringInDays

argüman:

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

PowerShell 2.0'da aynı komut şöyle görünür:

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

Yalnızca kendi sertifikalarınızı kontrol etmek için,

Cert:\LocalMachine\My

konteyner yerine

Cert:

kök klasörde. Böylece, Windows güvenilir kök sertifikalarını ve ticari sertifikaları kontrol etmeyeceksiniz.

Tüm etki alanı sunucularında önümüzdeki 30 gün içinde süresi dolacak sertifikaları bulmak için şu PowerShell betiğini kullanın:

$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

Süresi dolmak üzere olan sunucu sertifikalarının listesini alacaksınız ve bunları yenilemek için yeterli zamanınız olacak.

İlgili makaleler