PowerShellを使用したSSL/TLS証明書の有効期限の確認
サーバー証明書の予期しない期限切れは、ユーザーと顧客に多くの問題を引き起こす可能性があります。サイトとの安全な接続を確立できない、認証エラーが発生する、ブラウザに迷惑な通知が表示されるなどです。記事では、リモートサイトでSSL / TLS証明書の有効期限を確認する方法、またはドメイン内のサーバーまたはコンピューターのローカル証明書ストアで有効期限が切れる証明書のリストを取得する方法を示します。
多くのWebプロジェクトでは、無料のLet’sEncryptSSL証明書を使用してHTTPSを実装しています。これらの証明書は、 90の問題です。 日と定期的に更新する必要があります。通常、特別なスクリプトまたはボットは、ホスティング側またはサーバー側でLet’s Encrypt証明書を更新します(Windowsの場合はWACS、Linuxの場合はCertbotの場合があります)。ただし、証明書の自動更新が失敗する場合があります。 WebサイトでSSL証明書の有効期限を確認し、有効期限が近づいたときに通知する独自のスクリプトが欲しいのですが。 PowerShellを使用して作成しました。 HttpWebクエリを介してWebサイトの証明書を確認しているため、リモートのWebサイト/サーバーに対する管理者権限は必要ありません。
次のPowerShellスクリプトでは、証明書の有効期限を確認するWebサイトのリストと、対応する通知が表示され始める証明書の有効期間を指定する必要があります($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スクリプトは、リスト内のすべてのWebサイトの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
を使用してメール通知を送信することもできます 。
その後、期限切れまたは期限切れの証明書が見つかった場合は、電子メールとポップアップメッセージで通知されます。
次に、タスクスケジューラの自動タスクを作成して週に1〜2回実行し、PowerShellスクリプトを実行してHTTPSWebサイト証明書の有効期限を確認します。 (タスクスケジューラでタスクを作成し、Register-ScheduledTaskコマンドレットを使用してPS1スクリプトファイルを実行できます。)
また、PowerShellスクリプトで、ドメインサーバー(RDP / RDS、Exchange、SharePoint、LDAPS証明書など)またはユーザーのコンピューター上の暗号化サービスで使用される証明書の有効期限を確認する必要がある場合もあります。
ローカルコンピューターでは、次のコマンドを使用して証明書のリストを取得できます。
Get-ChildItem -Path cert
Powershell3.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
期限切れが近づいているサーバー証明書のリストが表示され、それらを更新するのに十分な時間があります。
-
JavaScriptでチェックボックスをチェックする
以下が入力タイプのチェックボックスであるとしましょう- <lable>John</lable> <input id="checkedValue1" type="checkbox"> <lable>David</lable> <input id="checkedValue2" type="checkbox"> チェックボックスのいずれかをチェックしたい。チェックボックスをオンにするには、checkedプロパティを使用します。 例 以下はコード
-
修正:このウェブサイトのセキュリティ証明書に問題があります
一部のWindowsユーザーは、「このWebサイトのセキュリティ証明書に問題があります」などのHTTPS証明書エラーを継続的に受け取るという奇妙な問題を経験しています。 「Twitter、Google、Facebookなどの有名なサイトやアプリにアクセスしようとするとエラーが発生します。ほとんどの場合、影響を受けるユーザーは、使用しようとするすべてのブラウザで同じタイプのエラーが発生することを報告しています。 結局のところ、これらの証明書エラーの原因となる最も一般的な原因は、日付と時刻の値が大幅に古くなっていることです。また、ブラウザに表示されるエラーは異なりますが、修正は常に同じです。シ