Nuxtstop

For all things nuxt.js

OpenBSD pkg_add がシステム時刻不正のために失敗

5 0

概要

先日、OpenBSDVirtualBox にインストールした直後に、pkg_addsyspatch を実行するとエラーが出ました。
TLS ハンドシェイクに失敗、と出力されていました。
いったんは /etc/installurl を編集することで解決できました。しかし実際のところ何が起こっていたのか、そしてそれがなぜなのかは、わかりませんでした。

@yoshi_kaw (Yoshihiro Kawamata) さん から親切なコメントを頂き、そのおかげで最終的に原因がマシンの時刻不正だということがわかりました。@yoshi_kaw さんは、OpenBSD を基盤とする軽量なライヴシステムである 河豚板 (FuguIta) OS の開発をされている方です。

TLS ハンドシェイクの失敗を解消するためには、システム時刻を正しくすることが必要でした。いくつかの方法があります:

  1. rdate を NTP サーバーに対して実行する (一時的な回避策です。毎回実行する必要があります)
  2. VirtualBox VM の Motherboard を調整する
  3. /etc/sysctl.confkern.utc_offset を設定する
    • 2. の代替手段です。

経緯と詳細

VM の作成

VirtualBox を起動して新しい VM を作成して、OpenBSD の ISO をアタッチしました。
そしてインストーラーに従って OpenBSD をインストールしました。

タイムゾーンの設定は以下の通りでした:

What timezone are you in? ('?' for list) [Asia/Tokyo]
Enter fullscreen mode Exit fullscreen mode

その後ファイルコピーが終わった時に、以下のようにたずねられました:

Time appears wrong. Set to 'Fri Feb 17 23:50:51 JST 2022'? [yes]
Enter fullscreen mode Exit fullscreen mode

ここで "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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

時刻はどのように狂っていたのか

ここで、システム日時を出力してみました:

$ date
Fri Feb 18 08:51:52 JST 2022
Enter fullscreen mode Exit fullscreen mode

驚きました。今日は "Feb 17" の夜のはずです。9 時間進んでいるようです。

解決の方法

rdate (一時策)

正しくする方法はあるのでしょうか。はい、rdate です!
NTP サーバーには、CloudFlare から提供されている time.cloudflare.com を用いました。余談ですが CloudFlare は、「インターネット接続に関わるすべてを安全 / プライベート / 高速 / 信頼できるものにするべく設計されたグローバル・ネットワーク」を構築している会社です。

$ rdate time.cloudflare.com
Thu Feb 17 23:51:28 JST 2022
Enter fullscreen mode Exit fullscreen mode

このあとに再チェックしました。

$ date
Thu Feb 17 23:51:53 JST 2022
Enter fullscreen mode Exit fullscreen mode

直りました。正しい日時です。
この状態ですと pkg_addsyspatch も使えます。

VirtualBox VM の Motherboard を調整する

rdate には問題があります。起動都度、実行する必要があるのです。これではまったく不便です。

下のように「ハードウェアクロックを UTC にする」にチェックを付けましょう。そうすれば正しい日時が維持されます!

マザーボードからシステム時刻を設定する

(補足) /etc/sysctl.confkern.utc_offset を設定する

VM を調整する以外の方法もあります。代わりにカーネルを調整するのです。

/etc/sysctl.conf を作成して以下のように記述しましょう:

kern.utc_offset=540
Enter fullscreen mode Exit fullscreen mode

それから再起動します。するとシステム情報が変更されたのがわかるでしょう:

kern.utc_offset: 0 -> 540
Enter fullscreen mode Exit fullscreen mode

カーネルの UTC オフセットが変更される

解決

以下のように、めでたく pkg_addsyspatch も正常終了するようになりました。

$ doas pkg_add -u
quirks-4.54 signed on 2022-02-16T11:41:33Z
quirks-4.54: ok

$ doas syspatch
Enter fullscreen mode Exit fullscreen mode

最後に

TLS ハンドシェイクの最初の段階で、クライアントはサーバーに ClientHello を送信し、サーバーは ServerHello で応えます。
この時クライアントで不正なシステム時刻が使われていると "ocsp verify failed: ocsp response not current" というエラーで失敗におわります。これは CA (認証局、Certificate Autorities) が未来の時刻におけるサーバー証明書の妥当性を保証できないためです。(OCSP とは Online Certificate Status Protocol のことです。)

本事象は VM 設定またはカーネル設定からシステム時刻を調整することで解決できます。さらに一時的な回避策として rdate を NTP サーバーに実行することも有効です。