একটি সার্ভার শংসাপত্রের একটি অপ্রত্যাশিত মেয়াদ আপনার ব্যবহারকারী এবং গ্রাহকদের জন্য অনেক সমস্যার কারণ হতে পারে:তারা আপনার সাইটের সাথে একটি সুরক্ষিত সংযোগ স্থাপন করতে সক্ষম নাও হতে পারে, প্রমাণীকরণ ত্রুটি ঘটতে পারে, একটি ব্রাউজারে বিরক্তিকর বিজ্ঞপ্তি উপস্থিত হতে পারে, ইত্যাদি প্রবন্ধে আমরা দেখাব কিভাবে দূরবর্তী সাইটগুলিতে একটি SSL/TLS শংসাপত্রের মেয়াদ শেষ হওয়ার তারিখ পরীক্ষা করতে হয়, অথবা আপনার ডোমেনের সার্ভার বা কম্পিউটারে স্থানীয় শংসাপত্রের দোকানে মেয়াদোত্তীর্ণ শংসাপত্রের একটি তালিকা পেতে হয়।
PowerShell দিয়ে একটি ওয়েবসাইট SSL সার্টিফিকেটের মেয়াদ শেষ হওয়ার তারিখ পান
অনেক ওয়েব প্রকল্প এইচটিটিপিএস বাস্তবায়নের জন্য বিনামূল্যে চলুন এনক্রিপ্ট এসএসএল শংসাপত্র ব্যবহার করে। এই শংসাপত্রগুলি 90-এর জন্য সমস্যা দিন এবং নিয়মিত পুনর্নবীকরণ করা আবশ্যক. সাধারণত, বিশেষ স্ক্রিপ্ট বা বট আপডেট করে লেটস এনক্রিপ্ট সার্টিফিকেট হোস্টিং বা সার্ভার সাইডে (এটি উইন্ডোজে WACS বা লিনাক্সে সার্টবট হতে পারে)। যাইহোক, কখনও কখনও স্বয়ংক্রিয় শংসাপত্র পুনর্নবীকরণ ব্যর্থ হয়। আমি আমার নিজস্ব স্ক্রিপ্ট রাখতে চাই যা ওয়েবসাইটগুলিতে 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 শংসাপত্রের মেয়াদ শেষ হতে চলেছে, আপনি একটি পপআপ বিজ্ঞপ্তি যোগ করতে পারেন৷ এটি করতে, স্ক্রিপ্ট লাইনটি আনকমেন্ট করুন “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
ব্যবহার করে একটি ইমেল বিজ্ঞপ্তি পাঠাতে পারেন .
তারপর যদি কোনো মেয়াদোত্তীর্ণ বা মেয়াদোত্তীর্ণ শংসাপত্র পাওয়া যায়, তাহলে আপনাকে একটি ইমেল এবং একটি পপআপ বার্তা দ্বারা অবহিত করা হবে৷
তারপরে সপ্তাহে একবার বা দুবার চালানোর জন্য টাস্ক শিডিউলারের জন্য একটি স্বয়ংক্রিয় কাজ তৈরি করুন এবং আপনার HTTPS ওয়েবসাইট শংসাপত্রের মেয়াদ শেষ হওয়ার তারিখগুলি পরীক্ষা করতে পাওয়ারশেল স্ক্রিপ্টটি চালান। (Register-ScheduledTask cmdlet ব্যবহার করে PS1 স্ক্রিপ্ট ফাইল চালানোর জন্য আপনি টাস্ক শিডিউলারে একটি টাস্ক তৈরি করতে পারেন।)
কিভাবে উইন্ডোজ সার্টিফিকেট স্টোরে মেয়াদোত্তীর্ণ শংসাপত্রগুলি দূরবর্তীভাবে চেক করবেন?
আপনার ডোমেন সার্ভারে (যেমন, RDP/RDS , Exchange, SharePoint, LDAPS শংসাপত্র ইত্যাদি) বা ব্যবহারকারীদের কম্পিউটারে ক্রিপ্টোগ্রাফিক পরিষেবাগুলির দ্বারা ব্যবহৃত শংসাপত্রগুলির মেয়াদ শেষ হওয়ার তারিখগুলি পরীক্ষা করার জন্য একটি PowerShell স্ক্রিপ্টেরও প্রয়োজন হতে পারে৷
একটি স্থানীয় কম্পিউটারে, আপনি কমান্ড ব্যবহার করে সার্টিফিকেটের একটি তালিকা পেতে পারেন:
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:
এর পরিবর্তে ধারক রুট ফোল্ডারে। সুতরাং, আপনি উইন্ডোজ বিশ্বস্ত রুট শংসাপত্র এবং বাণিজ্যিক শংসাপত্রগুলি পরীক্ষা করবেন না।
সমস্ত ডোমেন সার্ভারে আগামী 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
আপনি সার্ভার সার্টিফিকেটের তালিকা পাবেন যেগুলির মেয়াদ শেষ হতে চলেছে এবং আপনার কাছে সেগুলি পুনর্নবীকরণ করার জন্য যথেষ্ট সময় থাকবে৷