PowerShellでSSL/TLS証明書の有効期限を確認・監視する方法
サーバー証明書が予期せず失効すると、ユーザーや顧客にさまざまな問題が発生します。サイトとの安全な接続が確立できなくなったり、認証エラーが発生したり、ブラウザに警告表示が表示されたりする可能性があります。本記事では、リモートのWebサイト上のSSL/TLS証明書の有効期限を確認する方法と、ドメイン内のサーバーやクライアントPCのローカル証明書ストアから期限切れ間近の証明書の一覧を取得する方法を紹介します。
PowerShellでWebサイトのSSL証明書の有効期限を確認する
多くのWebプロジェクトでは、無料のLet's Encrypt SSL証明書を使ってHTTPSを実現しています。この証明書の有効期間は90日間と短く、定期的な更新が必須です。通常は、ホスティング側やサーバー側で専用のスクリプトやボット(WindowsならWACS、LinuxならCertbotなど)が自動更新を行います。しかし、自動更新が失敗することもあります。そこで、WebサイトのSSL証明書の有効期限をチェックし、期限が近づいたら通知してくれる独自スクリプトをPowerShellで作成しました。HTTPリクエスト経由でWebサイトの証明書を確認する方式のため、リモートのWebサーバーに対する管理者権限は不要です。
以下のPowerShellスクリプトでは、証明書の有効期限を確認したいWebサイトのリストと、通知を表示し始める証明書の残存日数($minCertAge)を指定します。ここでは例として80日を設定しています。
$minCertAge = 80
$timeoutMs = 10000
$sites = @(
"https://testsite1.com/",
"https://testsite2.com/",
"https://woshub.com/"
)
# 証明書の検証を無効化
[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
# ポップアップ通知の表示と管理者へのメール送信
#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
}
このスクリプトは、リスト内のすべての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回程度で実行される自動タスクを作成し、HTTPSサイトの証明書有効期限をチェックするPowerShellスクリプトを定期実行するように設定しましょう。Register-ScheduledTaskコマンドレットを使えば、PS1スクリプトファイルを実行するスケジュールタスクを簡単に作成できます。
Windows証明書ストアの期限切れ証明書をリモートで確認する方法
ドメインサーバー(RDP/RDS、Exchange、SharePoint、LDAPSなど)やユーザーのPCで、暗号化サービスに使用されている証明書の有効期限を確認したいケースもあるでしょう。
ローカルコンピューター上で証明書の一覧を取得するには、次のコマンドを使用します。
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コンテナーを指定します。こうすることで、Windowsの信頼されたルート証明書や市販の証明書がチェック対象に含まれるのを防げます。
ドメイン内のすべてのWindows Serverに対して、今後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でチェックボックスにチェックを入れる方法|checkedプロパティの使い方
Webフォームを作成していると、「ページを開いた時点で特定のチェックボックスにチェックを入れた状態にしたい」というケースがあります。JavaScriptでは、checkedプロパティを使うことで、これをとても簡単に実現できます。本記事では、具体的なコード例とともにその使い方をわかりやすく解説します。 サンプルで使うチェックボックス 今回は、以下のような2つのチェックボックスを例に説明します。 <label>John</label> <input id="checkedValue1" type="checkbox">
-
「このWebサイトのセキュリティ証明書に問題があります」エラーの原因と4つの解決策
Windowsユーザーの一部に、Twitter、Google、Facebookなどの主要なサイトやアプリにアクセスしようとすると、「このWebサイトのセキュリティ証明書に問題があります」というHTTPS証明書エラーが繰り返し表示されるという奇妙な問題が発生しています。多くの場合、影響を受けているユーザーは、どのブラウザを使っても同じ種類のエラーが表示されると報告しています。調査の結果、この証明書エラーの最も一般的な原因は、システムの日付と時刻が大きくずれていることであることがわかりました。ブラウザごとに表示されるエラーメッセージは異なりますが、解決方法は常に同じです。つまり、日付と時刻を正しく