OpenBSD pkg_add がシステム時刻不正のために失敗
Tags: openbsd, virtualbox, vm, troubleshooting
Published: 2022-02-18 13:31:35

## 概要

先日、[OpenBSD](https://www.openbsd.org/) を [VirtualBox](https://www.virtualbox.org/) にインストールした直後に、`pkg_add` や `syspatch` を実行するとエラーが出ました。
TLS ハンドシェイクに失敗、と出力されていました。
いったんは [`/etc/installurl` を編集することで解決できました](https://obsd.solutions/ja/blog/2022/02/13/openbsd-pkg_add-didnt-work-due-to-ocsp-verify-failed/index.html)。しかし実際のところ何が起こっていたのか、そしてそれがなぜなのかは、わかりませんでした。

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

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

1. `rdate` を NTP サーバーに対して実行する (一時的な回避策です。毎回実行する必要があります)
2. VirtualBox VM の Motherboard を調整する
3. [`/etc/sysctl.conf`](https://man.openbsd.org/sysctl.conf.5) で [`kern.utc_offset`](https://man.openbsd.org/sysctl.2#KERN_UTC_OFFSET) を設定する
  - 2. の代替手段です。

## 経緯と詳細

### VM の作成

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

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

```console
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` にも以下のエラーを返しました:

```console
$ 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` は成功していたにも関わらずです:

```console
$ 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
```

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

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

```console
$ date
Fri Feb 18 08:51:52 JST 2022
```

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

### 解決の方法

#### `rdate` (一時策)

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

```console
$ rdate time.cloudflare.com
Thu Feb 17 23:51:28 JST 2022
```

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

```console
$ date
Thu Feb 17 23:51:53 JST 2022
```

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

#### VirtualBox VM の Motherboard を調整する

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


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

![マザーボードからシステム時刻を設定する](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/crgs4hm1ed0lt8036s0n.jpg)

#### (補足) `/etc/sysctl.conf` で `kern.utc_offset` を設定する

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

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

```conf
kern.utc_offset=540
```

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

```
kern.utc_offset: 0 -> 540
```

![カーネルの UTC オフセットが変更される](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gessvd200yqtfw0ec12j.jpg)

### 解決

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

```console
$ 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 サーバーに実行することも有効です。