時刻ずれによる証明書・ビルドエラー - clock skew の解決
この記事で解決できること
makeの 「Clock skew detected」 警告と、TLS の 「certificate is not yet valid」 が同じ原因であることが分かる- 時計のずれが原因かどうかを
date/opensslで 即切り分け できる - 時計を正し、ビルドと証明書検証を 正常化する手順 が身につく
結論(切り分けの型)
- 症状はバラバラでも、根本は 「system clock が実際の時刻からずれている」 の 1 点
- まず
timedatectlとdate -uで 本当にずれているか を確認する - ずれていれば NTP で正し、ビルドは未来 mtime のファイルを
touchし直す
前提(対象環境)
- OS: Ubuntu / Debian / RHEL 系(systemd + chrony もしくは systemd-timesyncd)
- VM・コンテナ・Raspberry Pi など 時計が狂いやすい環境 を主に想定
clock skew とは何か?なぜ証明書とビルドが壊れるのか
結論: clock skew は system clock が実時刻からずれた状態。ビルドはファイル mtime が未来に、証明書は有効期間(notBefore)が未来に見えるため、どちらも「未来の時刻」として弾かれる。
clock skew(クロックスキュー)とは、マシンの system clock が正しい時刻からずれている状態を指す。ずれの方向で症状が変わる。
- 時計が遅れている(過去) → 取得したばかりの証明書が「まだ有効になっていない(not yet valid)」と判定される
- 時計が進んでいる(未来) → 生成したファイルの mtime が「未来」になり、ビルドツールが警告を出す
一見無関係なビルドエラーと証明書エラーが、**同じ「時刻の食い違い」**から生まれる点がこの問題の本質。証明書は notBefore(有効開始)/ notAfter(有効終了)という時刻の窓を持ち、make はファイルの新旧を mtime で比較する。どちらも「現在時刻」を基準にするため、基準そのものが狂うと連鎖的に壊れる。
よくある発生源
- VM のサスペンド / 復帰、スナップショット復元で時計が巻き戻る
- コンテナ起動時にホストの時計が狂っている
- RTC(ハードウェアクロック)の電池切れで再起動のたびに時刻リセット
- NFS でサーバとクライアントの時計がずれている(ファイル mtime が未来扱い)
まず時計がずれているかをどう確認するか
結論:
timedatectlで同期状態、date -uで現在の UTC を確認し、信頼できる外部時刻と比較する。数十秒以上ずれていれば clock skew が原因。
最初の診断は同期状態と現在時刻の確認。
$ timedatectl
Local time: Sat 2026-06-06 12:00:00 JST
Universal time: Sat 2026-06-06 03:00:00 UTC
RTC time: Sat 2026-06-06 03:00:00
Time zone: Asia/Tokyo (JST, +0900)
System clock synchronized: no
NTP service: active
System clock synchronized: no は未同期のサイン。次に外部の信頼できる時刻と突き合わせる。HTTP レスポンスの Date ヘッダは手軽な基準になる。
$ date -u $ curl -sI https://www.google.com | grep -i '^date:'
2 つの時刻が数十秒〜数分以上ずれていれば clock skew が原因と判断してよい。タイムゾーンの違い(JST と UTC)と取り違えないよう、比較は date -u(UTC)で行うのが安全。
タイムゾーン設定(Time zone)のずれは clock skew ではない。date -u の UTC 値が正しければ、表示時刻の差はタイムゾーンの問題であり、証明書・ビルドには影響しない。
ビルドの「Clock skew detected」をどう直すか
結論: 時計を正した後、未来 mtime のファイルを
find . -newermt nowで洗い出しtouchで現在時刻に直す。make cleanで作り直すのが最も確実。
make 実行時に次のような警告が出るのが典型。
make: Warning: File 'main.o' has modification time 9876 s in the future make: warning: Clock skew detected. Your build may be incomplete.
これはソースやオブジェクトファイルの mtime が、現在の system clock より未来になっているために起きる。make は mtime の新旧で再ビルド要否を判断するため、未来のファイルがあると依存解決が壊れ、ビルドが不完全になる恐れがある。
手順は「①時計を正す → ②未来 mtime を直す」の順。先に時計を直さないと、touch しても再びずれた現在時刻が刻まれる。
# 1. 時計を正す(詳細は後述の #fix-clock)
$ sudo timedatectl set-ntp true
# 2. 未来 mtime のファイルを検出
$ find . -newermt now -type f
# 3. 現在時刻に揃える
$ find . -newermt now -type f -exec touch {} +最も確実なのは中間生成物を捨てて作り直す方法。
$ make clean && make
NFS 上のソースで起きる場合は、NFS サーバとクライアントの両方の時計を同期する。片方だけ直しても、もう一方が刻んだ未来 mtime が残り再発する。
証明書の「not yet valid / expired」をどう直すか
結論:
openssl x509 -noout -datesで notBefore/notAfter を確認し、現在時刻が窓の外なら時計を疑う。時計を正せば証明書を再発行せずに解消することが多い。
時計が狂うと、正常な証明書でも検証に失敗する。ツール別の典型的なメッセージは次の通り。
# curl curl: (60) SSL certificate problem: certificate is not yet valid # git clone (https) fatal: unable to access '...': server certificate verification failed # Go 製ツール x509: certificate has expired or is not yet valid # apt update E: Release file for ... is not valid yet (invalid for another 5h 30min ...)
apt の「is not valid yet」は clock skew の分かりやすい証拠。証明書側の有効期間を openssl で確認する。
# ローカルの証明書ファイル
$ openssl x509 -in cert.pem -noout -dates
# 接続先サーバの証明書
$ echo | openssl s_client -connect example.com:443 2>/dev/null \
| openssl x509 -noout -datesnotBefore=Jun 5 00:00:00 2026 GMT notAfter=Sep 3 23:59:59 2026 GMT
現在の UTC(date -u)が notBefore より前なら「not yet valid」、notAfter より後なら「expired」。どちらも証明書自体は正常で、時計を正せば解消する。
証明書を再発行したり --insecure で検証を無効化する前に、必ず時計を確認すること。原因が clock skew なら証明書の入れ替えは無意味で、検証無効化はセキュリティを損なうだけになる。CA 証明書やチェーン不備が原因の場合は 「certificate verify failed」の解決 を参照。
時計を正しく直すには?
結論:
timedatectl set-ntp trueで NTP 同期を有効化し、chronyc makestepで即時補正。再起動後も維持するためhwclock --systohcで RTC へ書き戻す。
NTP 同期を有効化するのが基本。
$ sudo timedatectl set-ntp true $ timedatectl # System clock synchronized: yes を確認
大きくずれている場合、chrony は安全のため徐々に補正する。即時に合わせたいときは makestep を使う。
$ sudo chronyc makestep $ chronyc tracking # オフセットが 0 付近に収束したか確認
再起動でまた時刻がリセットされる(RTC 電池切れなど)場合は、正した system clock をハードウェアクロックへ書き戻す。
$ sudo hwclock --systohc
NTP 同期の仕組み・systemd-timesyncd と chrony の使い分けは サーバ時刻ズレの対処(NTP 同期) で詳しく扱う。
VM / コンテナの注意点
- コンテナはホストのカーネル時計を共有する。コンテナ内で NTP は動かせないため、ホスト側の時計を直す
- VM はサスペンド復帰やスナップショット復元で時計が飛ぶ。ハイパーバイザのゲスト時刻同期を有効にするか、ゲスト内で NTP を常駐させる
再発させないためのチェックリスト
結論: NTP 常駐・RTC 書き戻し・VM/NFS の時刻同期を恒久設定にすれば、clock skew 由来のビルド・証明書エラーはほぼ防げる。
| 対策 | コマンド / 設定 | 効果 |
|---|---|---|
| NTP 同期を常時有効 | timedatectl set-ntp true |
時刻ドリフトを自動補正 |
| RTC へ正しい時刻を保存 | hwclock --systohc |
再起動後の時刻リセット防止 |
| 監視で早期検知 | chronyc tracking のオフセット監視 |
ずれを障害化する前に検知 |
| NFS はサーバ・クライアント両同期 | 両ホストで NTP 有効化 | 未来 mtime の再発防止 |
コピペ用:clock skew 診断ワンライナー
# 同期状態・UTC・外部時刻を一括確認 timedatectl; echo "--- local UTC ---"; date -u; \ echo "--- remote ---"; curl -sI https://www.google.com | grep -i '^date:'