xxxx Key is stored in legacy trusted.gpg keyring
アップグレードしたDebianでAPTを実行すると次のようなメッセージが表示されるようになりました。
これは APTレポジトリの GPG鍵が古い形式で保存されている(trusted.gpg)ために表示される警告です。
trusted.gpg は複数の鍵をひとつにまとめて保存する形式の為、現在のセキュリティコンセンサスからすると改善が必要になるようです。
/etc/apt/truted.gpg.d ディレクトリにひとつずつ保存する運用が推奨されます。
なので、truted.gpg にまとめられている鍵を分解して、trusted.gpg.d へ移動させてあげることでメッセージは表示されなくなります。
鍵の抽出と再配置
まず鍵を抽出するための情報を取得します。
この作業を行うにあたり、apt-key コマンドで作業すると chatGPTからの回答を得ましたが、apt-key コマンド自体、(apt-key del をメンテナンス用に使うことを除いて)非推奨となっています。
この代替コマンドは gpg となります。
次のコマンドで、抽出対象となる鍵のIDを取得します。複数ある場合はすべてのIDを控えておきます。
# gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --list-keys gpg: /root/.gnupg/trustdb.gpg: trustdb created pub rsa4096 2014-06-13 [SC] 9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280 uid [ unknown] NodeSource <gpg@nodesource.com> sub rsa4096 2014-06-13 [E]
実行されると、keyringに指定したファイルと同名のファイルが、GnuPG HOMEに作成されますが、コピーができるわけではありません。これは、もとの署名ファイル trusted.gpg をどの程度信頼できるものと判断するかを保存しておく信頼度のデータ(trusted db)です。
ここで使用するオプションの概要は次の通りです。
- keyring
keyringとは、鍵を保存しておくファイルととらえれば問題ないと思います。
file コマンドでキーリング(trusted.gpg)を解析してみると次のような表示でした。
/etc/apt/trusted.gpg: OpenPGP Public Key Version 4, Created Fri Jun 13 16:20:06 2014, RSA (Encrypt or Sign, 4096 bits); User ID; Signature; OpenPGP CertificateOpenPGPの公開鍵のようです。
このオプションに指定した値の中に/が含まれない時は、GnuPG Home(~/.gnupg)ディレクトリを検索します。また指定しない場合はデフォルトのキーリングが指定されたものとなります。
- no-default-keyring
デフォルトのキーリングを除外するオプションです。通常 keyring オプションを使ってキーリングを指定した場合でも、結果はGnuPG HOMEに保存されているデフォルトのキーリングを含めたものになります。それを除外するために指定します。
- list-keys
公開鍵の情報を表示します。この出力は人間用に整形されたもので、一定の表示を保証するものではありません。もし、出力をプログラムで使う場合は --with-colon を使って出力を一定にします。ちなみに秘密鍵を表示したい場合には別のオプション list-secret-keys があります(APTの署名には秘密鍵は存在しません)。
上記の出力中の pub が公開鍵を意味し、上記の下線部が鍵のIDとなります。これを指定して出力します。
公開鍵をエクスポートするには export オプションを使います。同時に a オプションを付与することで ASCIIアーマー(人間が読むことができるファイル)化します。バイナリファイルとしてもエクスポートすることはできますが、それだとAPTが解釈できません。
すべてのキーを移動し終えたら、一旦/etc/apt/trusetd.gpg をどこかべつの場所に移動し、apt update が通常通り処理ができるがを確認します。問題なければ、元のファイルは削除します。
ちなみに、ASCIIアーマー化したファイルを調べると、次のような出力でした。
file /etc/apt/trusted.gpg.d/9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280.asc /etc/apt/trusted.gpg.d/9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280.asc: PGP public key block Public-Key (old)
今回はキーリング中のすべての鍵を対象としたので、ファイル単位の削除で問題ありませんが、もしキーリングから特定のキーだけ削除する場合は gpg --delete-key を使います。
再取得
もし、鍵を誤って壊したり消してしまったりした場合どうすればいいかも書いておきます。
Debianにおいてはhttps://ftp-master.debian.org/keys.htmlで各バージョンのキーを配布していますので、そちらから直接ダウンロードし、/etc/apt/trusted.gpg.dに入れれば解決します。
gpg コマンドを使って復旧させたい場合は次のような流れになります。
まず一旦 /etc/apt/trusted.gpg も /etc/apt/trusted.gpg.d/ にもファイルがない状態で apt update を実行します。すると次のようなエラーが発生します。
NO_PUBKEY xxxx というように、必要だけれども存在しない公開鍵のIDが表示されますので、これを頼りに鍵を取得します。
鍵はWebにあるキーサーバーから取得するのですが、その際内部的に dirmngr(GnuPG's network access daemon) を使います。存在しない場合はインストールが必要です。(鍵ファイルを直接ダウンロードのする方法を取ってください)。
基本的には gpg --recv-keys xxxx と鍵のIDを指定する事で、鍵を取得できます。
ただ、dirmngrはデフォルトでは、hkps://keys.gnupg.net(ランドロビン)に鍵を探しに行くようですが、gpg コマンドではここから得た鍵を登録できません。
# gpg --recv-keys 54404762BBB6E853 gpg: key A48449044AAD5C5D: new key but contains no user ID - skipped gpg: 処理数の合計: 1 gpg: ユーザIDなし: 1
これはkeys.gnpg.net がユーザー情報をカットして鍵を保持しているのに対し、セキュリティ要件のひとつとして gpg コマンドがユーザー情報を求める(出所のわからない鍵は採用されない)ことが原因です。
なので、dirmngr の鍵の取得先を変更します。(dirmngrが認識している)ホームディレクトリの dirmngr.conf ファイルにそれを記述します。詳しくは ps aux で dirmngrのプロセスを確認してもらいたいですが、通常 dirmngr は homedir として ~/.gnupgを指定しているので、ファイルはそこに作成します。
# ps aux | grep dirmngr root 141206 0.0 0.4 95868 18096 ? Ss 14:35 0:00 dirmngr --daemon --homedir /root/.gnupg
設定ファイル内に、keyserverのエントリーを作り hkps://keyserver.ubuntu.com とします。
~/.gnupg/dirmng.conf
keyserver hkps://keyserver.ubuntu.com設定ファイルを新規作成したり、変更してもプログラムはそれを読み込みに行かないので、リロードのためのシグナルを送ります。この方法は man dirmng に掲載されています。
設定が終わったら、gpgコマンドで鍵を受信します。
このままの状態だと、ユーザー毎の鍵のリストに追加されるだけなので、先ほどの--exportコマンドを使って配置します。