Computer >> 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 với PowerShell

Chứng chỉ máy chủ hết hạn bất ngờ có thể gây ra một số vấn đề cho người dùng và khách hàng của bạn: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 gây phiền nhiễu 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ẽ hướng dẫn cách kiểm tra ngày hết hạn của chứng chỉ SSL / TLS trên các trang web từ xa hoặc lấy danh sách các chứng chỉ hết hạn trong kho lưu trữ chứng chỉ cục bộ trên các máy chủ hoặc máy tính trong miền của bạn.

Nhận Ngày hết hạn của Chứng chỉ SSL trang web với PowerShell

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

Trong tập lệnh PowerShell sau, bạn phải chỉ định danh sách trang web 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 được 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
}

Tập lệnh PowerShell này sẽ kiểm tra chứng chỉ SSL của tất cả các trang web trong danh sách. Nếu phát hiện chứng chỉ sắp hết hạn, chứng chỉ đó sẽ được đánh dấu trong thông báo.

Kiểm tra ngày hết hạn chứng chỉ SSL / TLS với PowerShell

Để thông báo cho quản trị viên rằng chứng chỉ SSL sắp hết hạn, bạn có thể thêm thông báo bật lên. Để thực hiện, hãy bỏ ghi chú dòng script “ShowNotification $messagetitle $message ”Và thêm chức năng 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 thông báo qua email bằng Send-MailMessage .

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

Kiểm tra ngày hết hạn chứng chỉ SSL / TLS với PowerShell

Sau đó, tạo tác vụ tự động cho Bộ lập lịch tác vụ chạy một hoặc hai lần một tuần và chạy tập lệnh PowerShell để kiểm tra ngày hết hạn của chứng chỉ trang web HTTPS của bạn. (Bạn có thể tạo một tác vụ trong Bộ lập lịch tác vụ để chạy tệp kịch bản PS1 bằng lệnh ghép ngắn Register-SchedonedTask.)

Làm cách nào để Kiểm tra Chứng chỉ Hết hạn trong Cửa hàng Chứng chỉ Windows từ xa?

Bạn cũng có thể cần tập lệnh PowerShell kiểm tra ngày hết hạn của chứng chỉ được sử dụng bởi các dịch vụ mật mã trên máy chủ miền của bạn (ví dụ:chứng chỉ RDP / RDS, Exchange, SharePoint, LDAPS, v.v.) hoặc máy tính của người dùng.

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

Get-ChildItem -Path cert

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

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

Trong PowerShell 2.0, lệnh tương tự sẽ giố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 các chứng chỉ của riêng bạn, hãy sử dụng Cert:\LocalMachine\My vùng chứa thay vì Cert: trong thư mục gốc. Do đó, bạn sẽ không kiểm tra chứng chỉ gốc đáng tin cậy của Windows và chứng chỉ thương mại.

Để tìm các chứng chỉ sẽ hết hạn trong 30 ngày tới trên tất cả các máy chủ miền, hãy sử dụng tập lệnh PowerShell sau:

$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 với PowerShell

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