|||||||||||||||||||||

なんぶ電子

- 更新: 

xxxx Key is stored in legacy trusted.gpg keyring

GPG

アップグレードしたDebianでAPTを実行すると次のようなメッセージが表示されるようになりました。

xxxx Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

これは 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 Certificate

    OpenPGPの公開鍵のようです。

    このオプションに指定した値の中に/が含まれない時は、GnuPG Home(~/.gnupg)ディレクトリを検索します。また指定しない場合はデフォルトのキーリングが指定されたものとなります。

  • no-default-keyring

    デフォルトのキーリングを除外するオプションです。通常 keyring オプションを使ってキーリングを指定した場合でも、結果はGnuPG HOMEに保存されているデフォルトのキーリングを含めたものになります。それを除外するために指定します。

  • list-keys

    公開鍵の情報を表示します。この出力は人間用に整形されたもので、一定の表示を保証するものではありません。もし、出力をプログラムで使う場合は --with-colon を使って出力を一定にします。ちなみに秘密鍵を表示したい場合には別のオプション list-secret-keys があります(APTの署名には秘密鍵は存在しません)。

上記の出力中の pub が公開鍵を意味し、上記の下線部が鍵のIDとなります。これを指定して出力します。

公開鍵をエクスポートするには export オプションを使います。同時に a オプションを付与することで ASCIIアーマー(人間が読むことができるファイル)化します。バイナリファイルとしてもエクスポートすることはできますが、それだとAPTが解釈できません。

# gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --export -a 9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280>/etc/apt/trusted.gpg.d/9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280.asc

すべてのキーを移動し終えたら、一旦/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 を実行します。すると次のようなエラーが発生します。

W: 署名照合中にエラーが発生しました。リポジトリは更新されず、過去のインデックスファイルが使われます。GPG エラー: http://deb.debian.org/debian bookworm InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした: NO_PUBKEY 0E98404D386FA1D9 NO_PUBKEY 6ED0E7B82643E131 NO_PUBKEY F8D2585B8783D481

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 に掲載されています。

# pkill -SIGHUP dirmngr

設定が終わったら、gpgコマンドで鍵を受信します。

# gpg --recv-keys xxxx gpg: 鍵yyyy: 公開鍵"Debian Archive Automatic Signing Key (12/bookworm) <ftpmaster@debian.org>"をインポートしました gpg: 処理数の合計: 1 gpg: インポート: 1

このままの状態だと、ユーザー毎の鍵のリストに追加されるだけなので、先ほどの--exportコマンドを使って配置します。

# gpg --export -a xxxx>/etc/apt/trusted.gpg.d/xxxx.asc

筆者紹介


自分の写真
がーふぁ、とか、ふぃんてっく、とか世の中すっかりハイテクになってしまいました。プログラムのコーディングに触れることもある筆者ですが、自分の作業は硯と筆で文字をかいているみたいな古臭いものだと思っています。 今やこんな風にブログを書くことすらAIにとって代わられそうなほど技術は進んでいます。 生活やビジネスでPCを活用しようとするとき、そんな第一線の技術と比べてしまうとやる気が失せてしまいがちですが、おいしいお惣菜をネットで注文できる時代でも、手作りの味はすたれていません。 提示されたもの(アプリ)に自分を合わせるのでなく、自分の活動にあったアプリを作る。それがPC活用の基本なんじゃなかと思います。 そんな意見に同調していただける方向けにLinuxのDebianOSをはじめとした基本無料のアプリの使い方を紹介できたらなと考えています。

広告