Computer >> Hướng Dẫn Máy Tính >  >> Hệ Thống >> Máy Chủ Windows

Kiểm Tra Ngày Hết Hạn Chứng Chỉ SSL/TLS Bằng PowerShell

Việc hết hạn không mong đợi của chứng chỉ server có thể gây ra nhiều vấn đề cho user và khách hàng: họ có thể không thiết lập được kết nối an toàn với trang web của bạn, lỗi xác thực có thể xảy ra, thông báo phiền toái có thể xuất hiện trong trình duyệt, v.v. Trong bài viết này chúng tôi sẽ chỉ cách kiểm tra ngày hết hạn chứng chỉ SSL/TLS trên site từ xa, hoặc lấy danh sách chứng chỉ sắp hết hạn trong local certificate store trên server hoặc máy tính trong domain của bạn.

Lấy Ngày Hết Hạn Chứng Chỉ SSL Của Website Với PowerShell

Nhiều dự án web dùng chứng chỉ SSL miễn phí Let's Encrypt để triển khai HTTPS. Các chứng chỉ này được cấp cho 90 ngày và phải gia hạn thường xuyên. Thường thì script hoặc bot đặc biệt cập nhật chứng chỉ Let's Encrypt phía hosting hoặc server (có thể là WACS trong Windows hoặc Certbot trong Linux). Tuy nhiên, đôi khi gia hạn tự động chứng chỉ thất bại. Tôi muốn có script riêng kiểm tra ngày hết hạn chứng chỉ SSL trên website và thông báo cho tôi khi chúng sắp hết hạn. Tôi dùng PowerShell để tạo nó. Vì chúng ta kiểm tra chứng chỉ website qua truy vấn HttpWeb, chúng ta không cần quyền admin trên website/server từ xa.

Trong script PowerShell sau, bạn phải chỉ định danh sách website bạn muốn kiểm tra ngày hết hạn chứng chỉ và tuổi chứng chỉ khi thông báo tương ứng bắt đầu hiển thị cho bạn ($minCertAge). Tôi nhập 80 ngày làm ví dụ.

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

Script PowerShell này sẽ kiểm tra chứng chỉ SSL của tất cả website trong danh sách. Nếu tìm thấy chứng chỉ sắp hết hạn, nó sẽ được highlight trong thông báo.

Kiểm Tra Ngày Hết Hạn Chứng Chỉ SSL/TLS Bằng PowerShell

Để thông báo cho admin rằng chứng chỉ SSL sắp hết hạn, bạn có thể thêm popup notification. Để làm vậy, uncomment dòng script "ShowNotification $messagetitle $message" và thêm function sau:

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

Bạn cũng có thể gửi email notification dùng Send-MailMessage.

Sau đó nếu tìm thấy chứng chỉ hết hạn hoặc sắp hết hạn, bạn sẽ được thông báo bằng email và popup message.

Kiểm Tra Ngày Hết Hạn Chứng Chỉ SSL/TLS Bằng PowerShell

Sau đó tạo task tự động cho Task Scheduler chạy một hoặc hai lần mỗi tuần và chạy script PowerShell kiểm tra ngày hết hạn chứng chỉ HTTPS website của bạn. (Bạn có thể tạo task trong Task Scheduler chạy file PS1 script dùng Register-ScheduledTask cmdlet.)

Cách Kiểm Tra Chứng Chỉ Hết Hạn Trong Windows Certificate Store Từ Xa?

Bạn cũng có thể cần script PowerShell kiểm tra ngày hết hạn chứng chỉ dùng bởi dịch vụ cryptographic trên server domain của bạn (ví dụ, chứng chỉ RDP/RDS, Exchange, SharePoint, LDAPS, v.v.) hoặc máy tính user.

Trên máy tính cục bộ, bạn có thể lấy danh sách chứng chỉ dùng lệnh:

Get-ChildItem -Path cert

Powershell 3.0 có đối số đặc biệt -ExpiringInDays:

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

Trong PowerShell 2.0, cùng lệnh trông như sau:

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

Để chỉ kiểm tra chứng chỉ của bạn, dùng container Cert:\LocalMachine\My thay vì Cert: trong thư mục gốc. Như vậy, bạn sẽ không kiểm tra trusted root certificates và chứng chỉ thương mại của Windows.

Để tìm chứng chỉ sẽ hết hạn trong 30 ngày tới trên tất cả server domain, dùng script PowerShell này:

$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

Kiểm Tra Ngày Hết Hạn Chứng Chỉ SSL/TLS Bằng PowerShell

Bạn sẽ nhận được danh sách chứng chỉ server sắp hết hạn và có đủ thời gian để gia hạn chúng.