HTTPSサーバのSSL証明書有効期限をopensslコマンドだけで調べる
opensslコマンドって、意外と知られていない機能が満載なんですよ。
自己署名の証明書を作るには?なんていうページが大変多いけれど、あれは手順を書いただけで、たいていは本質的な事に何も触れていない事が多い。
で、今回はopensslコマンドだけであるサーバのSSL証明書有効期限を調べてみよう、という話です。
いきなりサンプルコードを載せます。解説はその後。
#!/bin/sh OPENSSL='/usr/local/ssl/bin/openssl' GREP='/usr/bin/grep' TEMPFILE='/tmp/ssl_validity_checker.temp' NULLFILE='/tmp/null.txt' KW_NB='Not Before: ' KW_NA='Not After : ' LISTFILE=$1 touch ${NULLFILE} for i in `cat ${LISTFILE} | grep -v '^#' | sed '/^$/d' ` do ${OPENSSL} s_client -connect ${i}:443 < $NULLFILE > ${TEMPFILE} 2>&1 NB=`${OPENSSL} x509 -text -in ${TEMPFILE} | ${GREP} "${KW_NB}"` NA=`${OPENSSL} x509 -text -in ${TEMPFILE} | ${GREP} "${KW_NA}"` echo ${i}, ${NB}, ${NA} done
$NULLFILEは、opensslコマンドが標準入力を待つので、それを回避するいい加減な小細工。$TEMPFILEは本当にテンポラリ。
- 第一引数$1に入れた、調べたいサーバリストに対して、openssl s_client コマンドを使って接続しに行く。
- サーバへのリクエストは何も送らないことにしたのでNULLFILEなんて名前にしているが、$NULLFILE の中にしかるべきリクエストの内容を入れても良い。(GET / HTTP/1.1 とか)
- 結果を$TEMPFILEに格納する
- 結果には証明書以外のいろんなものが含まれているが、これは特にいじらない
- openssl x509 コマンドで証明書の詳細な情報を出力させる
- 証明書以外の情報も食わせていることになるが、-----BEGIN CERTIFICATE----- と -----END CERTIFICATE----- の間に挟まれたものだけを対象にしてくれるので、どうでも良い。
- openssl x509 コマンドの結果を、'Not Before: ' と 'Not After : 'でgrepし、それぞれを結果として得る。
- SSL証明書って「いつからいつまで」、という期限じゃなくて、実は「いつより前でなくて、いつより後でない」という書き方になっている。
opensslコマンドは他にも、verify なんて便利なものもあるので、そのうち書こうかな。予定は未定。(そして多分かかない)