Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

การตรวจสอบวันหมดอายุใบรับรอง SSL/TLS ด้วย PowerShell

การหมดอายุของใบรับรองเซิร์ฟเวอร์โดยไม่คาดคิดอาจทำให้เกิดปัญหาหลายประการสำหรับผู้ใช้และลูกค้าของคุณ:พวกเขาอาจไม่สามารถสร้างการเชื่อมต่อที่ปลอดภัยกับไซต์ของคุณได้ ข้อผิดพลาดในการตรวจสอบสิทธิ์อาจเกิดขึ้น การแจ้งเตือนที่น่ารำคาญอาจปรากฏในเบราว์เซอร์ ฯลฯ ในการนี้ บทความ เราจะแสดงวิธีตรวจสอบวันหมดอายุของใบรับรอง SSL/TLS บนไซต์ระยะไกล หรือรับรายการใบรับรองที่หมดอายุในที่เก็บใบรับรองในเครื่องบนเซิร์ฟเวอร์หรือคอมพิวเตอร์ในโดเมนของคุณ

รับวันหมดอายุของใบรับรอง SSL ของเว็บไซต์ด้วย PowerShell

โครงการเว็บจำนวนมากใช้ใบรับรอง Let's Encrypt SSL ฟรีเพื่อใช้ 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://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 [email protected] -To [email protected] -Subject $messagetitle -body $message -SmtpServer gwsmtp.woshub.com -Encoding UTF8
}
write-host "________________" `n
}

สคริปต์ PowerShell นี้จะตรวจสอบใบรับรอง SSL ของเว็บไซต์ทั้งหมดในรายการ หากพบใบรับรองที่กำลังจะหมดอายุ จะมีการเน้นในการแจ้งเตือน

การตรวจสอบวันหมดอายุใบรับรอง SSL/TLS ด้วย PowerShell

หากต้องการแจ้งผู้ดูแลระบบว่าใบรับรอง 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 .

จากนั้นหากพบใบรับรองที่หมดอายุหรือหมดอายุ คุณจะได้รับแจ้งทางอีเมลและข้อความป๊อปอัป

การตรวจสอบวันหมดอายุใบรับรอง SSL/TLS ด้วย PowerShell

จากนั้นสร้างงานอัตโนมัติเพื่อให้ Task Scheduler ทำงานสัปดาห์ละครั้งหรือสองครั้ง และเรียกใช้สคริปต์ PowerShell เพื่อตรวจสอบวันหมดอายุของใบรับรองเว็บไซต์ HTTPS ของคุณ (คุณสร้างงานใน Task Scheduler เพื่อเรียกใช้ไฟล์สคริปต์ PS1 ได้โดยใช้ Register-ScheduledTask cmdlet)

จะตรวจสอบใบรับรองที่หมดอายุใน Windows Certificate Store จากระยะไกลได้อย่างไร

คุณยังอาจต้องใช้สคริปต์ PowerShell ตรวจสอบวันหมดอายุของใบรับรองที่ใช้โดยบริการเข้ารหัสลับบนเซิร์ฟเวอร์โดเมนของคุณ (เช่น RDP/RDS , Exchange, SharePoint, ใบรับรอง LDAPS เป็นต้น) หรือคอมพิวเตอร์ของผู้ใช้

ในเครื่องคอมพิวเตอร์ คุณจะรับรายการใบรับรองได้โดยใช้คำสั่ง:

Get-ChildItem -Path cert

Powershell 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

การตรวจสอบวันหมดอายุใบรับรอง SSL/TLS ด้วย PowerShell

คุณจะได้รับรายการใบรับรองเซิร์ฟเวอร์ที่กำลังจะหมดอายุ และคุณจะมีเวลาเพียงพอในการต่ออายุ