FreeBSD10.3: leap-seconds.list: Authentication error

先日、新規に FreeBSD10.3 をインストールして、時刻合わせのために ntpd を動かすと、「ntpd leapsecond file expired」というメッセージが /var/log/messages に記録されるというメモを書きました。

これは、デフォルトでインストールされるうるう秒管理ファイルが古いために発生するもので、「/etc/rc.d/ntpd onefetch」コマンドでファイルを更新することで回避できるということでした。

ところが、別のテスト環境を構築しようとして、OSインストール直後、同様にファイル更新しようとしたところ、同じコマンドを発行しているにもかかわらず、Authentication error でファイル更新できない現象が発生しました。

# /etc/rc.d/ntpd onefetch
Certificate verification failed for /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Root Certificate Authority - G2
675165984:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:/usr/src/secure/lib/libssl/../../../crypto/openssl/ssl/s3_clnt.c:1185:
fetch: https://www.ietf.org/timezones/data/leap-seconds.list: Authentication error

はっきり書いて、この うるう秒管理機能、私にはどうでもいい。しかし、リブートやサービス再起動の度、ログに

leapsecond file ('/var/db/ntpd.leap-seconds.list'): expired less than 224 days ago

と記録が残るのも気分悪い。心の平和のために、leap-second ファイルがなぜ更新できないのかを調査して解決することにしました。

過去の経験から、OSのパッチレベルが低いと推測。

# uname -a
FreeBSD vm-freebsd103 10.3-RELEASE FreeBSD 10.3-RELEASE #0 r297264: Fri Mar 25 03:51:29 UTC 2016     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC  i386

前回確かめたマシンも 10.3 でしたから、違いといえば新しく入れたパッケージとパッチレベルくらい。
freebsd-update で最新バージョンにすれば解決するんじゃないかと、予想。

freebsd-update fetch && freebsd-update install でOSを更新。リブート。

 # uname -a
FreeBSD vm-freebsd103 10.3-RELEASE-p11 FreeBSD 10.3-RELEASE-p11 #0: Mon Oct 24 18:47:18 UTC 2016     root@amd64-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC  i386

カーネル他一部ファイルが更新。
そして、fetchコマンドを発行。

# /etc/rc.d/ntpd fetch
Certificate verification failed for /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Root Certificate Authority - G2
675166112:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:/usr/src/secure/lib/libssl/../../../crypto/openssl/ssl/s3_clnt.c:1191:
fetch: https://www.ietf.org/timezones/data/leap-seconds.list: Authentication error

ところが、結果は同じくエラー!
エラーの示す場所は /usr/src の下なので、まさか /usr/src をインストールして更新しないと駄目なの?とちょっと不安になります。とりあえずソースだけ入れて、フェッチしてみましたが、変化無し。

# /etc/rc.d/ntpd fetch
Certificate verification failed for /C=US/ST=Arizona/L=Scottsdale/O=Starfield Technologies, Inc./CN=Starfield Root Certificate Authority - G2
675166112:error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed:/usr/src/secure/lib/libssl/../../../crypto/openssl/ssl/s3_clnt.c:1191:
fetch: https://www.ietf.org/timezones/data/leap-seconds.list: Authentication error

ビルドが終了しているマシンから、 /usr/src と /usr/obj を nfsマウントしてみたものの、同じ症状。

こうなると、OSじゃなくて、パッケージの方?先日 leap-second ファイルを更新したのは、WordPress のテストマシンですから、相当たくさんファイルがインストールされているはず。一つ一つ検討するのは面倒なので、やむなくメッセージを検索してみることにしたところ、見つかりました。

https://groups.google.com/forum/#!topic/fa.freebsd.bugs/pqLMGmS8P4Q

考えてみれば当たり前、Authentication error なので証明書も疑うべきでした。

ca_root_nss ファイルの更新が必要なんだそうです。

# pkg install ca_root_nss
Updating FreeBSD repository catalogue...
FreeBSD repository is up-to-date.
All repositories are up-to-date.
The following 1 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	ca_root_nss: 3.28

Number of packages to be installed: 1

324 KiB to be downloaded.

Proceed with this action? [y/N]: y
Fetching ca_root_nss-3.28.txz: 100%  324 KiB  33.2kB/s    00:10    
Checking integrity... done (0 conflicting)
[1/1] Installing ca_root_nss-3.28...
[1/1] Extracting ca_root_nss-3.28: 100%
Message from ca_root_nss-3.28:
********************************* WARNING *********************************

FreeBSD does not, and can not warrant that the certification authorities
whose certificates are included in this package have in any way been
audited for trustworthiness or RFC 3647 compliance.

Assessment and verification of trust is the complete responsibility of the
system administrator.

*********************************** NOTE **********************************

This package installs symlinks to support root certificates discovery by
default for software that uses OpenSSL.

This enables SSL Certificate Verification by client software without manual
intervention.

If you prefer to do this manually, replace the following symlinks with
either an empty file or your site-local certificate bundle.

  * /etc/ssl/cert.pem
  * /usr/local/etc/ssl/cert.pem
  * /usr/local/openssl/cert.pem

***************************************************************************

このあとで、ファイルをフェッチしてみたところ、成功。

# /etc/rc.d/ntpd fetch

でエラー無し。

# /etc/rc.d/ntpd restart
Stopping ntpd.
Starting ntpd.

ログを見てみると、

Jan 10 23:23:26 vm-freebsd103 ntpd[581]: ntpd exiting on signal 15 (Terminated)
Jan 10 23:23:26 vm-freebsd103 ntpd[9385]: ntpd 4.2.8p9-a (1): Starting
Jan 10 23:23:26 vm-freebsd103 ntpd[9388]: leapsecond file ('/var/db/ntpd.leap-seconds.list'): good hash signature
Jan 10 23:23:26 vm-freebsd103 ntpd[9388]: leapsecond file ('/var/db/ntpd.leap-seconds.list'): loaded, expire=2017-06-28T00:00:00Z last=2017-01-01T00:00:00Z ofs=37

と、無事にファイル更新完了。先日何のトラブルもなく うるう秒ファイルを更新できたのは、WordPress などのインストールのついでに証明書ファイルも更新されていたためのようです。

余談ですが、今年の正月は閏秒がありましたね。

まとめ

/var/db/ntpd.leap-seconds.list ファイルを更新しようとして、Authentication Error になる場合は、

  1. 「pkg install ca_root_nss」コマンドで、証明書を更新する
  2. 「/etc/rc.d/ntpd fetch」で うるう秒ファイルを更新

の2ステップが必要ということのようです。freebsd-update やソースファイルは不要(と思う。)

コメントを残す