SSL証明書期限切れでWebが停止『Web/DBの話⑥』
ある日突然、ブラウザに赤い警告。
APIは全滅、ユーザーはログイン不能。
原因はSSL証明書の期限切れ。
設定は正しいのに、更新を忘れただけで“事実上のサービス停止” になる、定番かつ致命的な事故だ。
冒頭の一言要約
SSLは“期限付き”。
切れた瞬間、Webは信頼を失い止まる。
症状(あるある)
ブラウザで「この接続ではプライバシーが保護されません」
HTTPSアクセスが拒否される
APIクライアントが証明書エラーで失敗
監視はHTTP 200なのに、実利用は不可
更新した“つもり”でも反映されていない
特定ドメインだけ突然死
原因と仕組み(なぜ起きるか)
証明書の有効期限管理をしていない
自動更新(Let’s Encrypt等)が途中で失敗
中間証明書(chain)不備で検証失敗
複数vhostの一部だけ更新漏れ
LB/リバースプロキシ配下で 片系だけ更新
再読み込み(reload)忘れで古い証明書を掴み続ける
図:期限切れは“即ブロック”になる
[クライアント]
│ HTTPS
▼
[Webサーバ]
├─ 証明書 有効 → 通信OK
└─ 証明書 期限切れ → 通信拒否
切り分け(最短コース)
証明書の有効期限確認
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates
Webサーバが使っている証明書の実体確認
Apache/Nginx の ssl_certificate / SSLCertificateFile
中間証明書の有無確認
フルチェーン指定になっているか
反映確認
systemctl reload nginx systemctl reload httpd
LB/多段構成の確認
どこでSSL終端しているか
今すぐ効く対処(テンプレ)
◆ 手動更新(例)
新証明書を配置
設定ファイルでパス更新
reload 実行
◆ Let’s Encrypt(例)
certbot renew
反映:
systemctl reload nginx
◆ 中間証明書(フルチェーン)指定(Nginx例)
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
恒久対策/再発防止チェックリスト
証明書の有効期限を監視(30日/14日前アラート)
自動更新の成否をログ・監視で確認
reload まで含めた更新手順を自動化
LB/多段構成の更新対象を明確化
フルチェーン指定を標準化
vhost 追加時に証明書管理をセットで実施
手動更新でも期限管理表を運用
失効・更新時の確認コマンドを手順書化
落とし穴(やりがちミス)
自動更新を“設定しただけ”で安心
reload 忘れで古い証明書を使い続ける
中間証明書不足で一部環境のみ失敗
監視がHTTPのみでHTTPS未監視
片系更新漏れ(冗長構成)
まとめ(行動指針)
SSL証明書は
「更新できるか」より「期限を管理できるか」 が重要。
期限監視 → 自動更新 → 反映確認。
この3点を仕組みに落とせば、
SSL期限切れによるWeb停止は確実に防げる。
