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 なんて便利なものもあるので、そのうち書こうかな。予定は未定。(そして多分かかない)