LoginSignup
13
9

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-01-31

定期的に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="recipient@mail.com"
# メール件名
$MailSubject="$WebsiteURL - SSL証明書が $ValidDays 日で失効します"
#送信メール
$MailFrom="sender@mail.com"
#送信メールサーバ
$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

13
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
9