OpenSSLを用いたSSL証明書期限確認の自動化

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証明書期限の確認方法は以上です。

コメント

タイトルとURLをコピーしました