OpenBSD pkg_add がシステム時刻不正のために失敗
概要
先日、OpenBSD を VirtualBox にインストールした直後に、pkg_add
や syspatch
を実行するとエラーが出ました。
TLS ハンドシェイクに失敗、と出力されていました。
いったんは /etc/installurl
を編集することで解決できました。しかし実際のところ何が起こっていたのか、そしてそれがなぜなのかは、わかりませんでした。
@yoshi_kaw (Yoshihiro Kawamata) さん から親切なコメントを頂き、そのおかげで最終的に原因がマシンの時刻不正だということがわかりました。@yoshi_kaw さんは、OpenBSD を基盤とする軽量なライヴシステムである 河豚板 (FuguIta) OS の開発をされている方です。
TLS ハンドシェイクの失敗を解消するためには、システム時刻を正しくすることが必要でした。いくつかの方法があります:
-
rdate
を NTP サーバーに対して実行する (一時的な回避策です。毎回実行する必要があります) - VirtualBox VM の Motherboard を調整する
-
/etc/sysctl.conf
でkern.utc_offset
を設定する- 2. の代替手段です。
経緯と詳細
VM の作成
VirtualBox を起動して新しい VM を作成して、OpenBSD の ISO をアタッチしました。
そしてインストーラーに従って OpenBSD をインストールしました。
タイムゾーンの設定は以下の通りでした:
What timezone are you in? ('?' for list) [Asia/Tokyo]
その後ファイルコピーが終わった時に、以下のようにたずねられました:
Time appears wrong. Set to 'Fri Feb 17 23:50:51 JST 2022'? [yes]
ここで "yes" を選んでも "no" を選んでも結果は同じでした...😅
TLS ハンドシェイクの失敗
この直後に新しいシステムを起動してログインしました。残念なことに VM は syspatch
にも pkg_add
にも以下のエラーを返しました:
$ doas pkg_add -u
https://cdn.openbsd.org/pub/OpenBSD/7.0/packages-stable/amd64/: TLS handshake failure: ocsp verify failed: ocsp response not current
https://cdn.openbsd.org/pub/OpenBSD/7.0/packages/amd64/: TLS handshake failure: ocsp verify failed: ocsp response not current
https://cdn.openbsd.org/pub/OpenBSD/7.0/packages/amd64/: empty
ping
は成功していたにも関わらずです:
$ ping cdn.openbsd.org
ping cdn.openbsd.org
PING cdn.openbsd.org ((...)): 56 data bytes
64 bytes from (...): icmp_seq=0 ttl=254 time=76.429 ms
64 bytes from (...): icmp_seq=1 ttl=254 time=45.498 ms
^C
--- cdn.openbsd.org ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 45.498/60.964/76.429/15.465 ms
時刻はどのように狂っていたのか
ここで、システム日時を出力してみました:
$ date
Fri Feb 18 08:51:52 JST 2022
驚きました。今日は "Feb 17" の夜のはずです。9 時間進んでいるようです。
解決の方法
rdate
(一時策)
正しくする方法はあるのでしょうか。はい、rdate
です!
NTP サーバーには、CloudFlare から提供されている time.cloudflare.com
を用いました。余談ですが CloudFlare は、「インターネット接続に関わるすべてを安全 / プライベート / 高速 / 信頼できるものにするべく設計されたグローバル・ネットワーク」を構築している会社です。
$ rdate time.cloudflare.com
Thu Feb 17 23:51:28 JST 2022
このあとに再チェックしました。
$ date
Thu Feb 17 23:51:53 JST 2022
直りました。正しい日時です。
この状態ですと pkg_add
も syspatch
も使えます。
VirtualBox VM の Motherboard を調整する
rdate
には問題があります。起動都度、実行する必要があるのです。これではまったく不便です。
下のように「ハードウェアクロックを UTC にする」にチェックを付けましょう。そうすれば正しい日時が維持されます!
(補足) /etc/sysctl.conf
で kern.utc_offset
を設定する
VM を調整する以外の方法もあります。代わりにカーネルを調整するのです。
/etc/sysctl.conf
を作成して以下のように記述しましょう:
kern.utc_offset=540
それから再起動します。するとシステム情報が変更されたのがわかるでしょう:
kern.utc_offset: 0 -> 540
解決
以下のように、めでたく pkg_add
も syspatch
も正常終了するようになりました。
$ doas pkg_add -u
quirks-4.54 signed on 2022-02-16T11:41:33Z
quirks-4.54: ok
$ doas syspatch
最後に
TLS ハンドシェイクの最初の段階で、クライアントはサーバーに ClientHello を送信し、サーバーは ServerHello で応えます。
この時クライアントで不正なシステム時刻が使われていると "ocsp verify failed: ocsp response not current" というエラーで失敗におわります。これは CA (認証局、Certificate Autorities) が未来の時刻におけるサーバー証明書の妥当性を保証できないためです。(OCSP とは Online Certificate Status Protocol のことです。)
本事象は VM 設定またはカーネル設定からシステム時刻を調整することで解決できます。さらに一時的な回避策として rdate
を NTP サーバーに実行することも有効です。