手を振るまもるくんゆるふわサイバーセキュリティ
考え中のまもるくん

TLS証明書の有効期限をPythonでチェック|"失効"事故を防ぐ

2026-09-22実践

#TLS証明書#HTTPS#有効期限#Python#実践

「証明書の期限が切れてサイトが真っ赤なエラーに」——これは有名企業でも起きる事故です。HTTPSを支えるTLS証明書には有効期限があり、更新を忘れると即障害。この記事ではPythonで証明書の期限を読み取り、失効前に警告する仕組みを作ります。

なぜ期限があるのか

証明書は「このサイトは本物」を保証する電子的な身分証。無期限だと、鍵が漏れたときに悪用され続けます。だから期限を区切り、定期更新を強制する設計になっています(近年は短期化の傾向)。

準備

pip install cryptography

① 証明書の期限を読み取る

まずテスト用に自己署名証明書を作り、その有効期限を読み出します。

import datetime
from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa

# テスト用の証明書を作成(有効期限30日)
key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
name = x509.Name([x509.NameAttribute(NameOID.COMMON_NAME, "example.local")])
now = datetime.datetime.now(datetime.timezone.utc)
cert = (x509.CertificateBuilder()
        .subject_name(name).issuer_name(name)
        .public_key(key.public_key())
        .serial_number(x509.random_serial_number())
        .not_valid_before(now)
        .not_valid_after(now + datetime.timedelta(days=30))
        .sign(key, hashes.SHA256()))

print("有効期限:", cert.not_valid_after_utc)

② 残り日数で警告する

期限までの残り日数を計算し、しきい値を切ったらアラートします。

def days_until_expiry(cert):
    now = datetime.datetime.now(datetime.timezone.utc)
    return (cert.not_valid_after_utc - now).days

remaining = days_until_expiry(cert)
print(f"残り {remaining} 日")

WARN_DAYS = 14
if remaining < 0:
    print("🚨 失効済み!今すぐ更新を")
elif remaining <= WARN_DAYS:
    print(f"⚠️ まもなく失効(残り{remaining}日)。更新を準備")
else:
    print("✅ 期限に余裕あり")

出力は 残り 29 日✅ 期限に余裕あり。しきい値を14日に設定しておけば、失効2週間前に気づけます。

③ 稼働中のサイトを調べるには

本番の監視では、稼働中サーバーから証明書を取得して同じ判定をかけます。

# 稼働サイトの証明書取得(イメージ・要ネットワーク)
# import ssl
# pem = ssl.get_server_certificate(("example.com", 443))
# cert = x509.load_pem_x509_certificate(pem.encode())
# print(days_until_expiry(cert))
🌱

自動更新が本命

Let's Encrypt + certbot などを使えば証明書は自動更新できます。それでも「自動更新が失敗していないか」を、このスクリプトで二重に監視するのが堅実。定期実行して残り日数をチャットに通知すれば、失効事故はほぼ防げます。

⚠️

期限だけでなく信頼チェーンも

期限が有効でも、証明書が信頼できる認証局(CA)から発行され、ドメイン名が一致していなければ安全ではありません。ブラウザやHTTPクライアントは通常これを自動検証します。自前で検証を無効化(verify=False)するのは避けましょう。

まとめ

  • TLS証明書には有効期限があり、切れると即サービス障害
  • cryptographyで証明書のnot_valid_afterを読み取れる
  • 残り日数がしきい値を切ったらアラートする
  • 自動更新+期限監視の二重化で失効事故を防ぐ

もう少し詳しく(背景と理論)

TLS証明書は X.509 という規格に基づく電子証明書で、「この公開鍵は確かにこのドメインのものだ」を認証局(CA)の署名で保証します1。ブラウザは、サーバー証明書→中間CA→ルートCAへと続く**信頼の連鎖(chain of trust)**を辿り、OSやブラウザに組み込まれた信頼済みルートに行き着くかを検証します2。Let's Encrypt の登場と自動発行プロトコル ACME により、無料・自動の証明書が普及しました3。検証で確認すべきは、有効期限・ドメイン名の一致・信頼チェーン・失効状態(OCSP/CRL)。誤発行を監視する Certificate Transparency(CT)ログにより、不正な証明書を公開的に検出できる仕組みも整っています。

次の一歩 🌸

HTTPSの全体像はHTTPSのしくみ、署名の基礎はRSA署名、更新管理のアップデートとパッチへどうぞ。

Footnotes

  1. X.509 は公開鍵証明書の標準フォーマット。主体名(ドメイン)・公開鍵・有効期間・発行者・CA署名などを含む。

  2. 検証はサーバー証明書から中間CAを経て信頼済みルートCAまで連鎖を辿る。どこか一つでも切れる/失効すると不正とみなす。

  3. Let's Encrypt と ACME プロトコル(RFC 8555)が証明書の自動発行・更新を実現し、HTTPS 化を大きく前進させた。

🔥 この分野の最新トレンドをチェック →

あわせて読みたい