SSL証明書には期限があります。
この期限が切れるとWebサイトへのアクセスが出来なくなったりするため、証明書の期限切れには注意する必要があります。
証明書がたくさんあると管理が大変な場合もあるので、OpenSSLを使って期限の確認をPowerShellで自動化してみました。
今回はSSL証明書の有効期限を確認するスクリプトを紹介します。
1.OpenSSLのインストール
1.下記のサイトから OpenSSL をダウンロードします。
Shining Light Productions
https://slproweb.com/products/Win32OpenSSL.html
2.ダウンロードした EXE ファイルを実行します。
3.「License Agreement」画面で「I accept the agreement」を選択し、「Next」をクリックします。
4.「Select Destination Location」画面で、そのまま「Next」をクリックします。
5.「Select Start Menu Folder」画面で、そのまま「Next」をクリックします。
6.「Select Additional Tasks」画面で、「The OpenSSL binaries (/bin) directory」を選択し、「Next」をクリックします。
サードパーティ製品のため、Windowsフォルダへの配置は推奨されていません。
その代わり、インストール後にパスを通す必要があります。
7.「Ready to Install」画面で、「Install」をクリックします。
8.インストールが完了したら全てのチェックを外し、「Finish」をクリックします。
9.binaryのパスを通します。
「システムのプロパティ」-「詳細設定」-「環境変数」をクリックします。
10.「Path」を選択し、「編集」をクリックします。
11.「新規」をクリックし、OpenSSLのbinaryのパスを追加します。
2.PowerShellスクリプト
下記の内容をPowerShellスクリプトとして作成します。
#期限切れまでの日数
$LIMIT=100
$TODAY=(Get-Date).ToString(“yyyyMMdd”)
$dt1=[DateTime]::ParseExact($TODAY,”yyyyMMdd”,$null)
#ログフォルダパス
$LOGDIR=”C:\Users\temp\Desktop”
#ログファイル名
$LOGNAME_OK=”openssl_” + $TODAY + “_OK.log” $LOGNAME_NG=”openssl_” + $TODAY + “_NG.log”
$LOG_OK=Join-Path $LOGDIR $LOGNAME_OK
$LOG_NG=Join-Path $LOGDIR $LOGNAME_NG
#URLリストファイル
$PATH=”C:\Users\temp\Desktop\URLList.txt”
$lines=Get-Content $PATH
foreach ($line in $lines) {
$DATE=openssl s_client -connect ${line}:443 2> $null | openssl x509 -noout -enddate
$DATE2=$DATE -split “=”
$DATE3=-split $DATE2
switch ($DATE3[2]) {
1 {$DATE3[2]=”01″}
2 {$DATE3[2]=”02″}
3 {$DATE3[2]=”03″}
4 {$DATE3[2]=”04″}
5 {$DATE3[2]=”05″}
6 {$DATE3[2]=”06″}
7 {$DATE3[2]=”07″}
8 {$DATE3[2]=”08″}
9 {$DATE3[2]=”09″}
}
switch ($DATE3[1]) {
Jan {$DATE4=$DATE3[4] + “01” + $DATE3[2]}
Feb {$DATE4=$DATE3[4] + “02” + $DATE3[2]}
Mar {$DATE4=$DATE3[4] + “03” + $DATE3[2]}
Apr {$DATE4=$DATE3[4] + “04” + $DATE3[2]}
May {$DATE4=$DATE3[4] + “05” + $DATE3[2]}
Jun {$DATE4=$DATE3[4] + “06” + $DATE3[2]}
Jul {$DATE4=$DATE3[4] + “07” + $DATE3[2]}
Aug {$DATE4=$DATE3[4] + “08” + $DATE3[2]}
Sep {$DATE4=$DATE3[4] + “09” + $DATE3[2]}
Oct {$DATE4=$DATE3[4] + “10” + $DATE3[2]}
Nov {$DATE4=$DATE3[4] + “11” + $DATE3[2]}
Dec {$DATE4=$DATE3[4] + “12” + $DATE3[2]}
}
$dt2=[DateTime]::ParseExact($DATE4,”yyyyMMdd”,$null)
$dt3=($dt2 – $dt1).Days
if ($dt3 -gt $LIMIT) {
Write-Output “[$line]`t`t有効期限は $dt3 日です。” | Out-File -FilePath $LOG_OK -Encoding Default -Append
}
else {
Write-Output “[$line]`t`t有効期限は $dt3 日です。” | Out-File -FilePath $LOG_NG -Encoding Default -Append
}
}
if (Test-Path $LOG_NG) {
$GET_NG=Get-Content $LOG_NG -Raw
Add-Type -AssemblyName System.Windows.Forms
$ANSWER=[System.Windows.Forms.MessageBox]::Show(“証明書の期限を確認しますか?`r`n$LOG_NG`r`n$GET_NG”,”証明書期限の警告”,”YesNo”,”Warning”,”button1″)
if ($ANSWER -eq “Yes”) {
Invoke-Item $LOGDIR
}
}
3.タスクスケジューラによる実行
今回のスクリプトをタスクスケジューラで実行する場合、いくつかの注意点があります。
ユーザーがログオンしているときのみ実行する(ロック時も動く)
タスクが実行されると一瞬だけPowerShellの画面が表示されます。
「ユーザーがログオンしているかに関わらず実行する」に設定すると画面を全く出さないように出来ますが、Windowsのユーザーセッション管理の都合上、ポップアップ通知が表示されなくなります。
プログラム/スクリプト
PowerShellの実行ファイルを指定する必要があります。
%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe
引数の追加
スクリプトファイルを引数として指定します。
また、ExecutionPolicyも追加します。
-windowstyle hidden -ExecutionPolicy RemoteSigned -Command “C:\Users\temp\Desktop\openssl.ps1”
SSL証明書期限の確認方法は以上です。
コメント