SSL証明書の有効期限の確認をWindowsで行う


定期的にWEBサイトのSSL証明書の有効期限を確認してメールなどでレポートしたい。
なのでコマンドラインやスクリプト等でチェックできないか。

コマンドで

Linuxの場合だと
下記の様にopensslでコマンドが実行できる。

$ openssl s_client -connect example.com:443 < /dev/null 2> /dev/null | openssl x509 -text | grep Not
            Not Before: Sep 25 09:14:02 2014 GMT
            Not After : Oct 27 09:49:54 2017 GMT
Not Afterの後が有効期限

Windows用のopensslバイナリがあるのでインストールしてみる。
http://www.digicert.ne.jp/howto/basis/openssl_on_windows.html
https://jp.globalsign.com/support/faq/177.html
下記のサイトの場所からWin32 OpenSSL v1.0.1L Light をダウンロードして
http://slproweb.com/products/Win32OpenSSL.html
下記の場所にインストールされるようにしてみた。
C:\OpenSSL-Win32\bin

先ほどのLinuxのコマンドを Windows用に書き換える。
/dev/null → nul
grep → findstr

:: binディレクトリに移動 
cd C:\OpenSSL-Win32\bin
:: OPENSSL_CONFの環境変数をセットしないとアラートが出る。システム環境変数にセットでもOK
set OPENSSL_CONF=C:\OpenSSL-Win32\bin\openssl.cnf
:: Not Afterの後が有効期限
openssl s_client -connect example.com:443 < nul 2> nul | openssl x509 -text | findstr Not
            Not Before: Sep 25 09:14:02 2014 GMT
            Not After : Oct 27 09:49:54 2017 GMT

:: ファイルに出力の場合はリダイレクトを追加
openssl s_client -connect example.com:443 < nul 2> nul | openssl x509 -text | findstr Not > c:¥xxx¥xxxx.txt

このコマンドを定期的に実行してファイルを書き込み、後続の処理でファイルを読み込んで、アラートを投げれば良いか。

PowerShellの場合

Powershell等でもできそうな気がするので、調べてみることにする。
※それっぽいのがあったので、後で調べる。
http://www.zerrouki.com/checkssl/
http://myitpath.blogspot.jp/2010/03/checking-ssl-cert-values-with.html

上記のサイトが正にその通りでした。
WEBサイトのSSL証明書の有効期限をチェックして、一定日数前になるとメールを出すPowershellのようです。

例外処理とか、標準出力の部分を除いて簡単にすると下のような感じ。

checkssl.ps1

# WEBサーバ
$WebsiteURL="example.com"
# ポート
$WebsitePort=443
# コモンネーム
$CommonName="example.com"
# 閾値日数
$Threshold="15"
# 宛先メール
$MailTo="[email protected]"
# メール件名
$MailSubject="$WebsiteURL - SSL証明書が $ValidDays 日で失効します"
#送信メール
$MailFrom="[email protected]"
#送信メールサーバ
$SmtpServer="mailserver.example.com"
#メール本文
$MailBody=@"
 WEBサイト "$WebsiteURL"のSSL証明書 は $ValidDays 日内に有効期限が切れます。
"@

# TCP/IP接続
$Conn = New-Object System.Net.Sockets.TcpClient($WebsiteURL,$WebsitePort) 
# SSL通信開始
$Stream = New-Object System.Net.Security.SslStream($Conn.GetStream())
# 証明書の検証を行う
$Stream.AuthenticateAsClient($CommonName) 
# 証明書の取得  
$Cert = $Stream.Get_RemoteCertificate()
# 証明書の失効日を取得
$ValidTo = [datetime]::Parse($Cert.GetExpirationDatestring())
# 現在から失効日までの日数を取得  
$ValidDays = $($ValidTo - [datetime]::Now).Days

if ($ValidDays -lt $Threshold)
{
# 残り日数が閾値日数未満の場合
    # 失効日を標準出力 
    Write-Host "証明書失効日: $ValidTo`n" -ForegroundColor Yellow
    # アラートメールを送信
    Send-MailMessage -To $MailTo -Subject $MailSubject -From $MailFrom -SmtpServer $SmtpServer -Priority High -BodyAsHtml $MailBody
}
else
{
    # 失効日を標準出力
    Write-Host "証明書失効日: $ValidTo`n" -ForegroundColor DarkGreen
}
$Conn.close()

PHPの場合

下記の通り
http://qiita.com/suzuki86/items/a971a5cbbcd6179a2695
http://www.pahoo.org/e-soul/webtech/phpsec/phpsec-13-01.shtm