この記事はNetBSD Advent Calendar 2023の6日目の記事です。
NetBSDでは以前からOpenSSLが標準ディストリビューションが含まれていましたが、10.0からはTLSで扱う証明書管理を行うcertctl(8)コマンドが追加されました。また、ルートCA証明書集であるmozilla-rootcertsが標準でバンドルされるようになりました。
なお、NetBSD 10.0は2023/12/6現在、まだRC1です。
なぜかNetBSD 10.0のアナウンスページのChangesにはcertctlが見つけられませんが…
certctl(8)は OpenSSLの証明書管理をコマンドラインから容易に行うためのユーティリティです。その実態はシェルスクリプトで、OpenSSLが使う証明書の登録や無効設定等を行えます。OpenSSLの一部機能を使いやすくしたWrapperスクリプトで、もっと直接的に言えば /etc/openssl/certs/ に設置する証明書を管理(追加したり削除したり)するものと言えます。
なお同名のコマンドが FreeBSD 12.2 から存在していますが、実装は異なりサポートする機能も多少異なりますが文法はだいたい合わせてあるようです。
詳しい使い方はman page等を参照してもらうとして。usageは以下のようになります。
Usage: certctl [-nv] [-C <config>] [-c <certsdir>] [-u <untrusted>]
<cmd> <args>...
certctl list
certctl rehash
certctl trust <cert>
certctl untrust <cert>
certctl untrusted
自明だと思いますが、listで表示、rehash でハッシュ再計算、trustで信頼する証明書の登録、untrsctで信頼しない証明書の登録、untrustedで信頼しない証明書の一覧、ですね。証明書の変更があった場合
# certctl rehash
とすれば適切に再登録してくれる、という感じです。
certctl(8)には設定ファイルがあります。これは
/etc/openssl/certs.conf
です。標準では有効な内容は以下の2行です。
netbsd-certctl 20230816
path /usr/share/certs/mozilla/server
1行めは単にcertctlのバージョンを示します。
2行めのpathは、管理対象となる証明書が存在するパスです。また、/etc/openssl/certs下をcertctlによらず直接管理する場合はmanualというキーワードを設定する必要があるようです。
さて、標準でpathに指定されている /usr/share/certs/mozilla/server に格納されている証明書ですが、これは Mozilla Projectが配布しているルートCA証明書集で、おそらくpkgsrcのsecurity/mozilla-rootcertsパッケージに含まれるものと同等と思われます。
NetBSD 10.0をインストールし、certctl listとすると次の様に一覧が出力さるでしょう。
% certctl list
/usr/share/certs/mozilla/server/ACCVRAIZ1.pem
/usr/share/certs/mozilla/server/AC_RAIZ_FNMT-RCM.pem
/usr/share/certs/mozilla/server/AC_RAIZ_FNMT-RCM_SERVIDORES_SEGUROS.pem
/usr/share/certs/mozilla/server/ANF_Secure_Server_Root_CA.pem
/usr/share/certs/mozilla/server/Actalis_Authentication_Root_CA.pem
(以下略)
もしも何も出力されなければrootで前述の certctl rehash を実行します。
NetBSD 9まではOpenSSLはバンドルされていましたが、ルートCAの証明書は無かったため、別途pkgsrcからmozila-rootcertsをインストールする必要があったのですが、 NetBSD 10 からはようやく直ぐにhttpsサイトにアクセスできるようになったということです。
httpsサイトへ正しく検証して接続といえばWebブラウザですが、例えばwww/firefoxはNetBSD9にインストールすると自動的にmozilla-rootcertsもインストールされるため困りません。ここではあえて依存しておらずでも使いがちなコマンドとして、gitコマンドを使ってみます。
NetBSD 9.xの場合 NetBSD 9.xにはまだcetctlもなくmozilla-rootcertsも標準バンドルされていません。
% uname -srmp
NetBSD 9.3_STABLE amd64 x86_64
% pkg_info | grep mozilla
% pkg_info | grep git-base
git-base-2.42.0 GIT Tree History Storage Tool (base package)
% git clone https://github.com/NetBSD/pkgsrc
Cloning into 'pkgsrc'...
fatal: unable to access 'https://github.com/NetBSD/pkgsrc/': SSL certificate problem: unable to get local issuer certificate
このように接続できません。
ここにmozilla-rootcerts-opensslをインストールします。
# pkg_add mozilla-rootcerts-openssl
...
$ git clone https://github.com/NetBSD/pkgsrc
Cloning into 'pkgsrc'...
remote: Enumerating objects: 4174596, done.
remote: Counting objects: 100% (71247/71247), done.
(以下略)
正しくGitHubにhttpsを使って接続できました。
NetBSD 10の場合
% uname -srmp
NetBSD 10.0_RC1 amd64 x86_64
% pkg_info | grep mozilla
% pkg_info | grep git
git-base-2.42.0 GIT Tree History Storage Tool (base package)
%
% git clone https://github.com/NetBSD/pkgsrc
Cloning into 'pkgsrc'...
remote: Enumerating objects: 4174596, done.
remote: Counting objects: 100% (71247/71247), done.
(以下略)
pkgsrcでmozilla-rootcertsを追加しなくてもhttps経由でGitHubに接続できました。
このように一手間減る感じです。
標準ディストリビューションにrootcertsが入ったのはいいのですが、いくつか懸念事項があります。
https://[user[:password]@]host[:port]/path
An HTTPS URL, retrieved using the HTTPS protocol. If set
https_proxy is defined, it is used as a URL to an HTTPS proxy
server. If HTTPS authorization is required to retrieve path, and
user (and optionally password) is in the URL, use them for the
first attempt to authenticate. There is currently no certificate
validation and verification.
と書いてあるんだけど?(実際には対応してるような気がする。単にマニュアル変更漏れ?)この記事は023/12/6におおしまやが書きました。