🎃
opensslコマンドを使ってSSL/TLSサーバ証明書の有効期限を確認したい
cronで適当に有効期限を定期的に確認したかったので作りました。
コマンド
最終的に作ったコマンドは下記の通り。
HOST=google.com
PORT=443
echo -ne "GET / HTTP/1.1\nHost: ${HOST}\nUser-Agent: TLS cert TTL monitoring\n\n" | openssl s_client -crlf -ign_eof -connect "${HOST}:${PORT}" 2> /dev/null | openssl x509 -noout -enddate | cut -d= -f2
コマンドの解説
シンプルに
まずシンプル版。人間が一発で確認する分にはこれで十分。コネクション確立して証明書の有効期限を確認して終わり。
HTTPのプロトコルを送信していないので、サーバー側がNGINXだとアクセスログは出力されるが、 status:400
以外空のログが出力されて、気持ちが悪い。
echo -e | openssl s_client -connect "${HOST}:${PORT}" 2> /dev/null | openssl x509 -noout -enddate
UAをサーバー側のログに出力させたい
次に、せめてユーザーエージェントぐらいはログにも出力したいと思って改善。HTTPプロトコルを素で書いて標準入力に渡す形。
opensslの -crlf
は、LFをCRLFに変更してくれる。そのため、echoでは \r\n
ではなく \n
を使っている。
しかし、このコマンドだと、echoの最後のEOFでopensslのクライアントが接続をすぐに閉じてしまい、サーバーのNGINX側で status:499
になって気持ちが悪い。
echo -e "GET / HTTP/1.1\nHost: ${HOST}\nUser-Agent: TLS cert TTL monitoring\n\n" | openssl s_client -crlf -connect "${HOST}:${PORT}" 2> /dev/null | openssl x509 -noout -enddate
NGINXでstatus:499を避けたい
最終的には、echoに -n
オプションもつけて、opensslに -ign_eof
オプションもつけることで完成。ついでに日付だけほしかったので、最後に cut -d= -f2
も追加した。
HOST=google.com
PORT=443
echo -ne "GET / HTTP/1.1\nHost: ${HOST}\nUser-Agent: TLS cert TTL monitoring\n\n" | openssl s_client -crlf -ign_eof -connect "${HOST}:${PORT}" 2> /dev/null | openssl x509 -noout -enddate | cut -d= -f2
HTTPプロトコルを生で書くことなんてほとんどなかったので、久しぶりに面白かったです。
Discussion