কম্পিউটার টিউটোরিয়াল

পাওয়ারশেল দিয়ে SSL/TLS সার্টিফিকেট এক্সপায়ারেশন ডেট চেক করা

একটি সার্ভার সার্টিফিকেটের অপ্রত্যাশিত এক্সপায়ারেশন আপনার ব্যবহারকারী এবং কাস্টমারদের জন্য অনেক সমস্যা তৈরি করতে পারে: তারা আপনার সাইটের সাথে সিকিউর কানেকশন স্থাপন করতে পারবে না, অথেন্টিকেশন এরর হতে পারে, ব্রাউজারে বিরক্তিকর নোটিফিকেশন আসতে পারে, ইত্যাদি। এই নিবন্ধে আমরা দেখাব কিভাবে রিমোট সাইটের SSL/TLS সার্টিফিকেটের এক্সপায়ারেশন ডেট চেক করতে হয়, অথবা আপনার ডোমেনের সার্ভার বা কম্পিউটারের লোকাল সার্টিফিকেট স্টোরে এক্সপায়ার হওয়া সার্টিফিকেটের তালিকা পেতে হয়।

পাওয়ারশেল দিয়ে ওয়েবসাইট SSL সার্টিফিকেটের এক্সপায়ারেশন ডেট পাওয়া

অনেক ওয়েব প্রজেক্ট HTTPS বাস্তবায়নের জন্য ফ্রি Let’s Encrypt SSL সার্টিফিকেট ব্যবহার করে। এই সার্টিফিকেটগুলো ৯০ দিনের জন্য ইস্যু হয় এবং নিয়মিত রিনিউ করতে হয়। সাধারণত, স্পেশাল স্ক্রিপ্ট বা বট হোস্টিং বা সার্ভার সাইডে Let’s Encrypt সার্টিফিকেট আপডেট করে (উইন্ডোজে WACS বা লিনাক্সে Certbot)। তবে, কখনো কখনো অটোমেটিক সার্টিফিকেট রিনিউয়াল ফেইল করে। আমি চাই একটি নিজস্ব স্ক্রিপ্ট থাকা যাতে ওয়েবসাইটের SSL সার্টিফিকেট এক্সপায়ার ডেট চেক করে এবং এক্সপায়ার হওয়ার আগে আমাকে নোটিফাই করবে। আমি পাওয়ারশেল ব্যবহার করে এটি তৈরি করেছি। যেহেতু আমরা HttpWeb কুয়েরি দিয়ে ওয়েবসাইটের সার্টিফিকেট চেক করছি, তাই রিমোট ওয়েবসাইট/সার্ভারে অ্যাডমিনিস্ট্রেটর প্রিভিলেজের প্রয়োজন নেই।

নিচের পাওয়ারশেল স্ক্রিপ্টে, আপনাকে যেসব ওয়েবসাইটের সার্টিফিকেট এক্সপায়ার ডেট চেক করতে চান তাদের তালিকা এবং সার্টিফিকেট বয়স নির্দিষ্ট করতে হবে যখন নোটিফিকেশন আপনাকে দেখানো শুরু হবে ($minCertAge)। উদাহরণস্বরূপ ৮০ দিন দিয়েছি।

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

এই পাওয়ারশেল স্ক্রিপ্ট তালিকাভুক্ত সকল ওয়েবসাইটের 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 ব্যবহার করে ইমেইল নোটিফিকেশনও পাঠাতে পারেন।

তারপর যদি কোনো এক্সপায়ার্ড বা এক্সপায়ার হওয়ার निकটের সার্টিফিকেট পাওয়া যায়, তবে আপনাকে ইমেইল এবং পপ-আপ মেসেজ দিয়ে নোটিফাই করা হবে।

রিমোটলি উইন্ডোজ সার্টিফিকেট স্টোরে এক্সপায়ার্ড সার্টিফিকেট চেক করা

আপনার ডোমেন সার্ভারগুলোতে ক্রিপ্টোগ্রাফিক সার্ভিসগুলোর জন্য ব্যবহৃত সার্টিফিকেটের (যেমন 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:-এর বদলে Cert:\LocalMachine\My কন্টেইনার ব্যবহার করুন। তাহলে উইন্ডোজ ট্রাস্টেড রুট সার্টিফিকেট এবং কমার্শিয়াল সার্টিফিকেট চেক করা হবে না।

ডোমেনের সকল সার্ভারে আগামী ৩০ দিনে এক্সপায়ার হওয়া সার্টিফিকেট খুঁজে বের করতে এই পাওয়ারশেল স্ক্রিপ্ট ব্যবহার করুন:

$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

আপনি এক্সপায়ার হওয়ার নিকটের সার্ভার সার্টিফিকেটের তালিকা পাবেন এবং সেগুলো রিনিউ করার জন্য পর্যাপ্ত সময় পাবেন।

  1. PowerShell দিয়ে উইন্ডোজ প্রসেস ম্যানেজমেন্ট

  2. PowerShell দিয়ে উইন্ডোজে এক্টিভ TCP/IP কানেকশন চেক করা

  3. জাভাস্ক্রিপ্টে চেকবক্স চেক করা

  4. Fix: "This website's security certificate ধারণ করে সমস্যা" এরর সমাধান