自由のなる木

RSS
公開日
2022-10-09

Guix の CA 証明書に関するトラブルの解決方法

Guix に限らない話ではあるが、git コマンドや curl コマンドを使用する時に、HTTPS 通信で証明書の検証エラーが発生してオペレーションが失敗するという経験をしたことがある人はいないだろうか。

大抵のディストリビューションでは、ca-certificates といった名前のパッケージを追加インストールしたり、ディストリビューションによって提供された CA 証明書を更新するコマンドなどを実行することで、この問題を解決することができる。

Guix の場合、Guix 固有の事情も相俟って、このトラブルでハマるケースが多いように感じるため、発生しがちな問題と解決方法をまとめてみることにした。

追記

この記事を @roptat さんが英語に翻訳してくれたので、英語でも読むことができる。とてもありがたく、うれしい。

How to fix the issue with CA certificates in Guix

ca-certificates パッケージがない

他のディストリビューションで ca-certificates という名前で提供されているパッケージ相当は、Guix では nss-certs という名前で提供されている。

これは guix search ca-certificates で検索してもヒットしないため、ひとつの落し穴かもしれないと思っている。

Guix System を使用している場合は、初期テンプレートやドキュメントに nss-certs が含まれているため、敢えて自分でそれを削除しない限り問題は起こらないと思っているが、別のディストリビューションでパッケージマネージャとして Guix を使用する場合は、自分でインストールする必要がある。

/etc/ssl/certs ディレクトリがない

Guix は NixOS と同様に FHS に準拠しないディストリビューションである。

nss-certs をインストールしても、/etc/ssl/certs ディレクトリが作成され、そこに CA 証明書が設置されることはない。

したがって、Guix で使用するソフトウェアが CA 証明書を求める場合、Guix 上のどこにそれが存在するかを教えてやる必要がある。

可搬性に優れたソフトウェアは、環境変数でそれらを指定できるようになっている場合が多いため、その場合は環境変数で指定すれば良い。

参考: X.509 Certificates (GNU Guix Reference Manual)

また、Guix にパッケージとして収録されているソフトウェアの場合は、元のソフトウェアがそうでない場合でも、環境変数でそれらを指定できるようにするパッチが当たっている場合がある。また、環境変数が自動で設定されるようになっているパッケージもある (curlgit など) ため、Guix で導入したパッケージではこの問題は発生しにくい。

ソフトウェアにパッチを当てるのが困難だったりする場合は、nss-certs でインストールされた CA 証明書の含まれたパス ($GUIX_PROFILE/etc/ssl/certs など) から /etc/ssl/certs に対してシンボリックリンクを貼るという強引な解決方法もある。

ただ、この方法は諸刃の剣だ。本当であれば問題が発生する状況で問題が発生しなくなることがあるため、問題の再現性が担保できなくなる。あまりお勧めできないものの、私は自己責任の範囲でこの解決方法を使っていたりもする。

Flatpak で導入したソフトウェアで証明書エラーが発生する

ほとんどのソフトウェアで問題が生じたことはないのだが、Guix が SSL_CERT_DIRSSL_CERT_FILE を環境変数に指定するがため1に、Flatpak でインストールしたソフトウェアがそのパスを尊重することで (OpenSSL ライブラリなど) 証明書のエラーが発生することがあった。

具体的には Flatpak で導入した Zoom でこの問題が発生2した。Zoom が起動してもそれ以上先に進めなくなるという問題だったので、Zoom を利用する上では致命的な問題だった。

雑に説明すると、Flatpak でソフトウェアを起動するということは、docker run コマンドでソフトウェアを起動するようなものだ。ホスト環境とは隔離されたサンドボックス環境で、ライブラリなどの依存関係を含有した自己完結したソフトウェアが動作する。

したがって、Flatpak でインストールされたソフトウェアは、明示的に許可したリソースを除き、ホスト環境にはアクセスできない。これはセキュリティ的には望ましい挙動で、ホスト環境にインストールされたライブラリなどに依存しないため、再現性も担保された優れた仕組みだ。

Zoom で発生した証明書エラーは、SSL_CERT_DIRSSL_CERT_FILE で指定されたパスに、Zoom がアクセスできないことで、CA 証明書が取得できず、証明書の検証に失敗してしまうという問題だった。

Flatpak では Docker の Volume のように、ホスト環境の特定のパスへの個別のアクセス権を設定できるため、下記のコマンドを実行し、Zoom がホスト環境の CA 証明書に読み取り専用でアクセスできるようにして、問題を解決した。3

flatpak override --user --filesystem=$GUIX_PROFILE:ro --filesystem=/gnu/store:ro us.zoom.Zoom

まだ未知の問題があるかもしれないが、概ね上記の解決方法のいずれかで、Guix を使用する上での CA 証明書に関する問題は解決できるのではないかと思う。

今後、新たなパターンの問題に遭遇し、ワークアラウンドが確立したら、ここに追記することにする。

以上。


  1. curl コマンドなどをインストールすると自動的に設定される。 

  2. 私の環境では途中からこの問題が発生するようになったため、パッケージ構成やインストールするバージョンによっては問題ないのかもしれない。 

  3. パスが書き変わった時の対応が面倒なので、ストア全体を読み取り許可を与えているが、範囲が広すぎるため緩過ぎるとは思う。ただ、この記述は汎用的なので、Zoom に限らず、他のソフトウェアでもそのまま使用できる。