この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
SE時代、その電話が鳴ったのは平日の朝8時過ぎのことでした。
前日まで何の問題もなく動いていたサーバーが、日付が変わっただけでサービスを停止させる。
原因は、ApacheのSSL証明書(TLS証明書)の期限切れでした。
この記事では、20年以上Linuxサーバーを運用・指導してきた経験から、SSL証明書の期限切れがどのように障害を引き起こすのか、そして「次は絶対に見逃さない」ための証明書管理の鉄則を解説します。
この記事のポイント
・SSL証明書が切れると、ブラウザがサイトをブロックしECサイトは事実上の機能停止になる
・openssl s_client -connect ホスト名:443 で証明書の有効期限を即座に確認できる
・cronとシェルスクリプトを組み合わせれば「うっかり見逃し」を防げる
・更新作業は期限の2ヶ月前に着手するのが現場の鉄則
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜSSL証明書が切れるとサービスが止まるのか
WebサーバーでHTTPS通信を行うためのSSL証明書(TLS証明書)には、必ず有効期限があります。現在の証明書は最大397日(約13ヶ月)が上限とされていますが、SE時代に管理していた頃は1年・2年単位で購入するケースが一般的でした。年に1度しか来ない更新タイミングをカレンダーだけで管理していると、見逃してしまうのは当然です。
証明書の期限が1秒でも過ぎると、ブラウザはサーバーとの接続を「信頼できない」と判断します。Chromeなら「NET::ERR_CERT_DATE_INVALID」、Firefoxなら「SEC_ERROR_EXPIRED_CERTIFICATE」というエラーが表示され、一般のユーザーはそこから先に進めなくなります。
技術的にはApacheもLinuxも正常に動いている。しかしユーザーからは「サイトが壊れた」「買い物できない」と映る。これがSSL証明書期限切れ障害の本質です。
あの日、何が起きたか——SE時代の体験談
1. 朝一番の電話
担当していた顧客は、自社でECサイトを運営している企業でした。電話の内容を整理すると、購入画面にセキュリティ警告が表示されており、誰も購入できない状態が朝から続いているとのことでした。「Apacheのサービスは起動しているか?」「ネットワークは疎通しているか?」——通常の障害対応を始めようとしたとき、ふと思い出したのが「そういえば、SSL証明書の更新手続きを先月ベンダーに依頼していたはずだが、完了確認をしていなかった」という一点でした。
慌ててサーバーにSSH接続し、opensslコマンドで確認を始めました。
2. opensslで原因を特定する
証明書の有効期限を確認するには、opensslコマンドが使えます。稼働中のサーバーに対してリモートから直接確認する場合は以下のコマンドが有効です。# 稼働中のサーバーに接続して証明書の有効期限を確認する openssl s_client -connect www.example.com:443 </dev/null 2>/dev/null | openssl x509 -noout -dates # 実行結果(例) notBefore=Sep 1 00:00:00 2023 GMT notAfter=Aug 31 00:00:00 2024 GMT
サーバー上の証明書ファイルを直接確認することもできます。
# サーバー上の証明書ファイルを直接確認する(RHEL系のデフォルトパス例) openssl x509 -noout -enddate -in /etc/pki/tls/certs/server.crt # 実行結果(例) notAfter=Aug 31 00:00:00 2024 GMT
3. 証明書を差し替えてApacheを再起動するまで
証明書ベンダーから発行済みの新しい証明書ファイルがサーバー上に送付されていることを確認し、Apacheの設定ファイルが参照しているパスに証明書を配置しました。証明書を差し替えたら、Apacheの設定に構文エラーがないかを確認してから再起動します。
# Apacheの設定ファイルの構文チェック(どちらか動く方を使う) apachectl configtest # または httpd -t # 問題なければ再起動(RHEL/AlmaLinux/Rocky Linux系) systemctl restart httpd # Debian/Ubuntu系の場合 systemctl restart apache2
この経験があまりにも痛かったため、以来20年以上、証明書管理だけは必ず仕組みで防ぐようになりました。
現役講師が今も守る証明書管理の3つの鉄則
セミナーで3,100名以上を指導してきた中で、SSL証明書の期限切れによるサービス停止は「完全に防げる障害」として必ず取り上げています。以下の3つを守るだけで、うっかり期限切れはほぼゼロになります。1. opensslコマンドで月1回の手動確認をする
管理しているサーバーの証明書期限を、月に一度は手動で確認する習慣を持ちましょう。コマンド一発で確認できるため、作業時間は1分もかかりません。# 本番サーバーの証明書有効期限をリモートから確認する openssl s_client -connect www.example.com:443 </dev/null 2>/dev/null | openssl x509 -noout -dates # 証明書ファイルを直接確認する場合 openssl x509 -noout -enddate -in /etc/pki/tls/certs/server.crt
2. cronで自動期限チェックを仕込む
手動確認には必ず抜け漏れが生じます。複数サーバーを管理している場合や、担当者が変わるタイミングでも安全であるために、cronで自動チェックするシェルスクリプトを仕込むのが現場の定石です。#!/bin/bash # SSL証明書の有効期限をチェックしてメール通知するスクリプト # /usr/local/bin/check_ssl_cert.sh として保存する HOSTNAME="www.example.com" ALERT_DAYS=60 MAIL_TO="admin@example.com" # 証明書の有効期限を取得(notAfter の日付文字列) EXPIRE_DATE=$(openssl s_client -connect ${HOSTNAME}:443 </dev/null 2>/dev/null | openssl x509 -noout -enddate | cut -d= -f2) EXPIRE_EPOCH=$(date -d "${EXPIRE_DATE}" +%s) NOW_EPOCH=$(date +%s) DAYS_LEFT=$(( (EXPIRE_EPOCH - NOW_EPOCH) / 86400 )) if [ ${DAYS_LEFT} -le ${ALERT_DAYS} ]; then echo "${HOSTNAME} のSSL証明書が${DAYS_LEFT}日後に期限切れになります。更新を開始してください。" | mail -s "SSL証明書 期限切れ警告 ${DAYS_LEFT}日前" ${MAIL_TO} fi
# crontabに追加する(毎週月曜日午前9時に実行) # crontab -e で以下の行を追加する 0 9 * * 1 /usr/local/bin/check_ssl_cert.sh
3. 更新作業は期限の2ヶ月前から動く
証明書の更新は「申請すればすぐ使える」というものではありません。ベンダーへの申請・ドメイン認証・証明書の発行に数日かかる場合があり、更新後のテスト環境での動作確認や本番への適用・再起動作業を含めると相応の時間が必要です。私が現場で守っているのは「期限の2ヶ月前を更新開始の締め切りにする」という鉄則です。
・期限3ヶ月前:証明書更新の必要性を確認。ベンダーへの申請開始
・期限2ヶ月前:新証明書の受領完了。ステージング環境でのテスト
・期限1ヶ月前:本番環境への適用・動作確認完了
Apacheの設定ファイルの扱い方については、Apacheのタイムアウト設定と設定ファイルの基礎も合わせて参照してください。
証明書エラーが出た時の主な原因と対処法
20年以上の運用経験から、SSL証明書に関するエラーには「期限切れ」以外にもいくつかのパターンがあります。復旧の際に役立つ主なケースをまとめます。【対処1】証明書の期限切れ(notAfterが過去の日付)
最も多いケースです。証明書を差し替えてApacheを再起動すれば解決します。新しい証明書が手元にない場合は、まずベンダーへ緊急発行を依頼しつつ、一時的に「ユーザーに注意を呼びかけるHTTP用メンテナンスページ」に切り替えることで被害を最小化できます。【対処2】中間証明書(Chain証明書)の欠落
本番環境でSSL証明書を設定した直後、一部のブラウザやモバイル端末で「証明書が信頼されていない」と表示される場合があります。多くの場合、中間証明書(Intermediate Certificate)が設定されていないことが原因です。Apache(mod_ssl)では以下の設定が必要です。
# Apacheの設定ファイル(httpd.conf または ssl.conf)で中間証明書を指定する # 注意: SSLCertificateChainFile は Apache 2.4.8以降で非推奨 # SSLCertificateFile に中間証明書をまとめたものを指定するか、 # 以下のように個別に指定する(バージョンにより異なる) # Apache 2.4.8以降(推奨): 中間証明書をサーバー証明書と結合して使用 # cat server.crt intermediate.crt > server_chain.crt SSLCertificateFile /etc/pki/tls/certs/server_chain.crt SSLCertificateKeyFile /etc/pki/tls/private/server.key
【対処3】証明書とドメイン名の不一致
証明書に記載されているコモンネーム(CN)またはSAN(Subject Alternative Name)と、実際のドメイン名が一致しない場合もエラーになります。「www.example.com」の証明書を「example.com」で使うと不一致になるケースが典型的です。opensslコマンドで確認できます。# 証明書のコモンネームとSANを確認する openssl x509 -noout -text -in /etc/pki/tls/certs/server.crt | grep -E "Subject:|DNS:" # リモートから接続して証明書の詳細を確認する場合 openssl s_client -connect www.example.com:443 </dev/null 2>/dev/null | openssl x509 -noout -subject -ext subjectAltName
まとめ
SSL証明書の期限切れは「確実に予測できる障害」です。しかし、日々のサーバー運用の中で「まだ大丈夫だろう」という油断が積み重なり、気づいたときには期限が切れていた——という経験を、20年以上の指導の中で何度も聞いてきました。私が現場で「あの朝の電話」から学んだのは、技術的な知識よりも「仕組みで防ぐ」という姿勢の大切さです。cronによる自動チェックと、2ヶ月前から動くカレンダー管理を組み合わせることで、証明書の期限切れ障害はほぼゼロにできます。
Linuxのcronの設定方法については、cronの設定方法|crontabの書き方と実践例も参照してください。
| やること | 方法・コマンド | タイミング |
|---|---|---|
| 証明書の有効期限を手動確認する | openssl s_client -connect ホスト名:443 </dev/null 2>/dev/null | openssl x509 -noout -dates |
月1回 |
| 証明書ファイルを直接確認する | openssl x509 -noout -enddate -in /etc/pki/tls/certs/server.crt |
月1回または更新作業時 |
| 自動チェックを仕込む | check_ssl_cert.sh をcronで週次実行 |
サーバー構築直後 |
| 証明書の更新を開始する | ベンダーへの申請・受領・本番適用 | 期限の2ヶ月前 |
証明書管理の確認習慣も含め、現場で迷わない「サーバー構築の型」を身につけませんか?
SSL証明書の期限切れは、発生してから気づく典型的なトラブルです。正しい設定と確認手順を「体系的な知識」として最初から身につけることが、本番での迷走を防ぎます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:Linuxでバックアップから初めてリストアした日の話|本当に戻せるか分からない恐怖と現役講師が今も続ける確認の習慣
- この記事の属するカテゴリ:Linux学習ガイドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます