🎃

opensslコマンドを使ってSSL/TLSサーバ証明書の有効期限を確認したい

2022/05/20に公開

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