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 にパッケージとして収録されているソフトウェアの場合は、元のソフトウェアがそうでない場合でも、環境変数でそれらを指定できるようにするパッチが当たっている場合がある。また、環境変数が自動で設定されるようになっているパッケージもある (curl
や git
など) ため、Guix で導入したパッケージではこの問題は発生しにくい。
ソフトウェアにパッチを当てるのが困難だったりする場合は、nss-certs でインストールされた CA 証明書の含まれたパス ($GUIX_PROFILE/etc/ssl/certs
など) から /etc/ssl/certs
に対してシンボリックリンクを貼るという強引な解決方法もある。
ただ、この方法は諸刃の剣だ。本当であれば問題が発生する状況で問題が発生しなくなることがあるため、問題の再現性が担保できなくなる。あまりお勧めできないものの、私は自己責任の範囲でこの解決方法を使っていたりもする。
Flatpak で導入したソフトウェアで証明書エラーが発生する
ほとんどのソフトウェアで問題が生じたことはないのだが、Guix が SSL_CERT_DIR
や SSL_CERT_FILE
を環境変数に指定するがため1に、Flatpak でインストールしたソフトウェアがそのパスを尊重することで (OpenSSL ライブラリなど) 証明書のエラーが発生することがあった。
具体的には Flatpak で導入した Zoom でこの問題が発生2した。Zoom が起動してもそれ以上先に進めなくなるという問題だったので、Zoom を利用する上では致命的な問題だった。
雑に説明すると、Flatpak でソフトウェアを起動するということは、docker run
コマンドでソフトウェアを起動するようなものだ。ホスト環境とは隔離されたサンドボックス環境で、ライブラリなどの依存関係を含有した自己完結したソフトウェアが動作する。
したがって、Flatpak でインストールされたソフトウェアは、明示的に許可したリソースを除き、ホスト環境にはアクセスできない。これはセキュリティ的には望ましい挙動で、ホスト環境にインストールされたライブラリなどに依存しないため、再現性も担保された優れた仕組みだ。
Zoom で発生した証明書エラーは、SSL_CERT_DIR
や SSL_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 証明書に関する問題は解決できるのではないかと思う。
今後、新たなパターンの問題に遭遇し、ワークアラウンドが確立したら、ここに追記することにする。
以上。