SSL/TLS証明書の有効期限を確認する方法を、手軽なものから自動化まで順に紹介します。証明書の有効期間は2029年に47日まで短縮されるため、確認の自動化が重要になります。
SSLチェッカーにホスト名を入力すると、有効期限・残り日数・チェーンの正しさ・ホスト名の一致を表示します。ホスト名が複数のIPアドレスに解決される場合は、すべてのアドレスを個別にチェックし、証明書が異なるサーバがあれば警告します。
アドレスバーの鍵(サイト情報)アイコンから「接続が保護されています」→「証明書は有効です」を開くと、有効期間を確認できます。ただし、ブラウザが接続した1台のサーバの証明書しか見えません。
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
notAfter が有効期限です。-servername(SNI)を付けないと、別の証明書が返ることがあります。
残り日数を判定したい場合は -checkend(秒)が便利です。
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null \
| openssl x509 -noout -checkend $((30*86400)) && echo "OK: 30日以上" || echo "NG: 30日未満"
ロードバランサやDNSラウンドロビンの配下では、IPアドレスごとに確認します。
for ip in $(dig +short www.example.com A); do
printf '%s ' "$ip"
echo | openssl s_client -connect "$ip:443" -servername www.example.com 2>/dev/null \
| openssl x509 -noout -enddate -fingerprint -sha256
done
echo | openssl s_client -connect mail.example.com:587 -starttls smtp 2>/dev/null | openssl x509 -noout -dates
openssl x509 -in /etc/letsencrypt/live/www.example.com/cert.pem -noout -enddate
ファイルが新しくても、Webサーバをリロードしていなければ古い証明書が配信されます。最終確認は必ず外部から行いましょう。
community.crypto.get_certificate で各ノードの配信中の証明書を取得し、残り日数を検証できます。
- name: Get served certificate
community.crypto.get_certificate:
host: "{{ ansible_host }}"
port: 443
server_name: www.example.com
delegate_to: localhost
register: served_cert
- name: Assert at least 30 days remain
ansible.builtin.assert:
that:
- ((served_cert.not_after | to_datetime('%Y%m%d%H%M%SZ')) - now(utc=true)).days >= 30
SSLチェッカーの無料APIは、全IPアドレスの確認結果を pass / fail で返します。証明書の更新ジョブの最後に組み込むと、反映漏れをすぐに検知できます。
curl -fsS "https://sslcheck.nakayumc.com/api/v1/check?host=www.example.com&min_days=30&nocache=1" | jq -e '.result == "pass"'
更新前の有効期限を expect_not_after_gt に指定すれば、「期限が延びたこと」を条件にもできます。