はじめに
Chromeでは、システムクロックがズレた状態でHTTPSのサイトにアクセスすると、NET::ERR_CERT_DATE_INVALID
と言うエラーページが表示される。システムクロックがずれている場合は、サーバ証明書の有効期限外になることもあり接続を続けるわけにはいきません。
この時、システムクロックがズレてる旨表示されます。
NET::ERR_CERT_DATE_INVALID で時刻ズレ検出の仕組み
このNET::ERR_CERT_DATE_INVALID
で時刻ズレと出す仕組みについては単純で、Chromeが独自に現在時刻を確認し、時刻が大きくズレていれば画面を出している。
その具体的にな仕組みについては、Googleの人らがHTTPSのエラー状況について調査した「Where the Wild Warnings Are: Root Causes of Chrome Certificate Errors」について書かれている。余談だが、このPaperではHTTPSエラーの原因の統計をとっており、システムクロックも大きな割合を締めている。
このPaperに基づけば、2017年5月のChromeの安定版より入ったこのクライアントの時刻ズレ検出は以下の通り行われている。
証明書の日付が不正だった場合、Chromeはハードコードされた公開鍵に対応する鍵を持つアップデートサーバに時刻を問い合わせます。その間、3秒までエラー表示を遅延させます。3秒以内に時刻が得られ、システムクロックと大きく異なる場合は、最初に上げたようにNET::ERR_CERT_DATE_INVALID
の画面を表示します。
得られた時刻は以後の利用のためにキャッシュされます。
Future work.
この論文ではFuture workが書かれています。曰く、信頼できるソースから得られた時刻を持ってしてサーバ証明書を検証すれば、このエラー表示を出す必要すらないということだと思う。
そのために下記の課題をあげている。
- プラットフォームの証明書検証ライブラリを使用しており、システムクロック以外の時刻を利用できない場合がある。独自の証明書検証実装を行う必要がある。
- 独自に得られた時刻を元に正しくサーバ証明書を検証できたとしても、ユーザにシステムクロックを修正するよう促すべきである。
また「googleの新しい時刻同期プロトコル Roughtimeとは」で書いたように、新しい安全な時刻同期プロトコルの開発は現在も続けられている。