警告: apt-key は非推奨です。代わりに、trusted.gpg.d でキーリングファイルを管理してください。質問する

警告: apt-key は非推奨です。代わりに、trusted.gpg.d でキーリングファイルを管理してください。質問する

私はelasticsearchをインストールしていましたこのガイドただし、elasticsearch は実際にはこの質問の一部ではありません。

最初のステップでは、キーを追加する必要があります。

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

そして次のメッセージを受け取りました:

Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).

インストールプロセスは問題ありませんでしたが、廃止されたため、 に代わる新しい使用方法を探していますapt-key。(パッケージのインストールには問題はありません。)man apt-key私が見たところ

apt-key(8)はDebian 11とUbuntu 22.04で最後に利用可能になります。

...

したがって、任意の apt バージョンで使用することを意図したバイナリ キーリング ファイルは、常に gpg --export を使用して作成する必要があります。

しかし、代替案は書かれていませんでしたapt-key add。試してみました

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --export

wgetしかし、動作しませんでした。では、 whenのパイプapt-keyを削除した後は何を使用すればよいのでしょうか?

ベストアンサー1

キーを追加する/etc/apt/trusted.gpg.d不安なすべてのリポジトリにキーを追加するためです。これがまさにapt-key非推奨

短縮版

似たようなことをする信号https://example.com/EXAMPLE.gpgにリストされているリポジトリの のキーを使用する場合は/etc/apt/sources.list.d/EXAMPLE.list、次のようにします。

sudo mkdir -m 0755 -p /etc/apt/keyrings/

curl -fsSL https://example.com/EXAMPLE.gpg |
    sudo gpg --dearmor -o /etc/apt/keyrings/EXAMPLE.gpg

echo "deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt stable main" |
    sudo tee /etc/apt/sources.list.d/EXAMPLE.list > /dev/null
# Optional (you can find the email address / ID using `apt-key list`)
sudo apt-key del [email protected]
# Optional (not necessary on most systems)
sudo chmod 644 /etc/apt/keyrings/EXAMPLE.gpg
sudo chmod 644 /etc/apt/sources.list.d/EXAMPLE.list

ロングバージョン

廃止通知では にキーを追加することを推奨していますが/etc/apt/trusted.gpg.d、これは安全ではない解決策です。引用するとLinux Uprisingの記事:

この変更の理由は、APT リポジトリの署名に使用される OpenPGP キーを/etc/apt/trusted.gpgまたはに追加すると/etc/apt/trusted.gpg.d、そのキーは、システム上で設定されている (下記参照) オプションのない他のすべてのリポジトリ (signed-by公式 Debian / Ubuntu リポジトリも含む) の APT によって無条件に信頼されるためです。その結果、署名キーが/etc/apt/trusted.gpgまたはに追加された非公式 APT リポジトリは、/etc/apt/trusted.gpg.dシステム上の任意のパッケージを置き換えることができます。したがって、この変更はセキュリティ上の理由 (ユーザーのセキュリティ) で行われました。

適切な解決策はLinux Uprisingの記事そしてDebian ウィキ: キーを保存し/etc/apt/keyrings/(/usr/share/keyrings/キーがパッケージによって管理されている場合)、apt ソース リストでキーを参照します。

したがって、適切な方法は次のとおりです。

  1. ディレクトリを作成
    PGPキー用のディレクトリが存在しない場合は作成し、権限を設定します。この手順では、推奨される権限万が一、変更してしまった場合はumasksudo を使用しますumask_override。ディレクトリの作成は、実際には Debian 12 および Ubuntu 22.04 より古いリリースでのみ必要ですが、どちらの場合でもこの行を実行しても問題はありません。

    sudo mkdir -m 0755 -p /etc/apt/keyrings/
    
  2. キーをダウンロード
    からキーをダウンロードしhttps://example.com/EXAMPLE.gpg、 に保存します。に/etc/apt/keyrings/EXAMPLE.gpgオプションを指定すると、エラーメッセージが有効になり、リダイレクトが確実に実行され、出力が削減されて sudo のパスワードプロンプトが表示されます。-fsSLcurlDebian wikiの説明古いソフトウェアとの互換性を保つために、キーのアーマーを解除する (つまり、base64 からバイナリに変換する) 必要があります。

    curl -fsSL https://example.com/EXAMPLE.gpg |
        sudo gpg --dearmor -o /etc/apt/keyrings/EXAMPLE.gpg
    

    file /etc/apt/keyrings/EXAMPLE.gpgオプションで、実行して出力を調べることで、ダウンロードしたファイルが実際に PGP キーであることを確認できます。

  3. リポジトリを登録する
    キーは追加されましたが、aptリポジトリについてはまだ認識されていません。リポジトリを追加するには、/etc/apt/sources.list.d/リポジトリの使用方法とキーの場所を記述したファイルを作成する必要があります。作成されたファイルの内容は次のようになります。

    deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt stable main
    

    これは、signed-by先ほどダウンロードしたキーにリンクしているはずです。

    リポジトリで を指定する必要がある場合arch、または複数のコンポーネント( など)を使用する場合main contrib、コンテンツは次のようになります。

    deb [arch=amd64 signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt stable main contrib
    

    既存のリポジトリから適応する場合は、既存のものをコピーし、signed-by=...の間にを追加するだけです[]

  4. (オプション)古いキーを削除する
    以前に でサードパーティのキーを追加した場合はapt-key、それを削除する必要があります。 を実行してsudo apt-key listすべてのキーを一覧表示し、以前に追加されたキーを見つけます。次に、キーの電子メール アドレスまたはフィンガープリントを使用して を実行します。sudo apt-key del [email protected]

  5. (オプション) 権限を強制的に設定
    のカスタムumask_overrideセットがある場合、または ACL を使用する場合、ファイルは通常とsudoは異なる権限で作成されます。このような場合は、 および の権限を に明示的に設定します。EXAMPLE.gpgEXAMPLE.list644

新しいDEB822形式を使用する

apt リポジトリを指定するための新しい DEB822 形式ははるかに優れており、使いやすいですが、すべてのプラットフォームのすべてのツールでまだ完全にサポートされているわけではありません。

短縮版

上記のスクリプトを実行する代わりに、

echo "Types: deb
URIs: https://example.com/apt
Suites: stable
Components: main
Signed-By:
$(wget -O- https://example.com/EXAMPLE.gpg | sed -e 's/^$/./' -e 's/^/ /')" | sudo tee /etc/apt/sources.list.d/EXAMPLE.sources > /dev/null

# Optional (not necessary on most systems)
sudo chmod 644 /etc/apt/sources.list.d/EXAMPLE.sources

ロングバージョン

のソースでは1行形式を使用する代わりにsources.list.d、新しい複数行形式DEB822を使用することもできます。この形式は人間にとって読みやすいです。そしてコンピューターで使用されており、2015 年から apt で利用できます。Debian と Ubuntu は、2023 年後半から DEB822 をデフォルトの形式として使用することを計画しています。 Repolib のドキュメントには優れた比較が掲載されており、新しい形式の背後にある動機が説明されています。さらに、apt 2.2.4以降では、公開鍵を直接sources.list

サードパーティのリポジトリでホストされているパッケージを管理する場合は、オプションで入力された DEB822 を.sourcesユーザーが利用できるようにすることを検討してください。

これが現在、この回答のメインの回答ではなく別のセクションになっている理由は、まだサポートされている Debian および Ubuntu の一部のバージョンに、apt の古いバージョンが同梱されているためです。具体的には、Debian 10 LTS (EOL: 2024-06-30) および Ubuntu 20.04 (EOL: 2025-04-30) は古すぎますが、Debian 11 以降および Ubuntu 22.04 以降は問題ありません。さらに、apt をラップするのではなくソース ファイルを解析する一部のツールでは、これらの機能のすべてがまだ完全にサポートされていない可能性があります。

1 行形式から DEB822 形式に切り替えるには、次の 2 つのファイルがあるとします。

  • /etc/apt/sources.list.d/example.list:
    deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt stable main
    
  • /etc/apt/keyrings/EXAMPLE.gpg:
    (実際のキーはこれよりずっと長くなければなりません。このキーは短すぎて安全ではありません。)
    -----BEGIN PGP PUBLIC KEY BLOCK-----
    
    mI0EZWiPbwEEANPyu6pUQEydxvf2uIsuuYOernFUsQdd8GjPE5yjlxP6pNhVlqNo
    0fjB6yk91pWsoALOLM+QoBp1guC9IL2iZe0k7ENJp6o7q4ahCjJ7V/kO89mCAQ09
    yHGNHRBfbCo++bcdjOwkeITj/1KjYAfQnzH5VbfmgPfdWF4KqS/TmJP9ABEBAAG0
    G0phbmUgRG9lIDxqYW5lQGV4YW1wbGUub3JnPojMBBMBCgA2FiEEK8v49DttJG7D
    35BwcvTpbeNfCTgFAmVoj28CGwMECwkIBwQVCgkIBRYCAwEAAh4BAheAAAoJEHL0
    6W3jXwk4YLID/0arCzBy9utS8Q8g6FDtWyJVyifIvdloCvI7hqH51ZJ+Zb7ZLwwY
    /p08+Xnp4Ia0iliwqSHlD7j6M8eBy/JJORdypRKqRIbe0JQMBEcAOHbu2UCUR1jp
    jJTUnMHI0QHWQEeEkzH25og6ii8urtVGv1R2af3Bxi9k4DJwzzXc5Zch
    =8hwj
    -----END PGP PUBLIC KEY BLOCK-----
    

次に、これら 2 つのファイルを 1 つのファイルに置き換えます/etc/apt/sources.list.d/example.sources

Types: deb
URIs: https://example.com/apt
Suites: stable
Components: main
Signed-By:
 -----BEGIN PGP PUBLIC KEY BLOCK-----
 .
 mI0EZWiPbwEEANPyu6pUQEydxvf2uIsuuYOernFUsQdd8GjPE5yjlxP6pNhVlqNo
 0fjB6yk91pWsoALOLM+QoBp1guC9IL2iZe0k7ENJp6o7q4ahCjJ7V/kO89mCAQ09
 yHGNHRBfbCo++bcdjOwkeITj/1KjYAfQnzH5VbfmgPfdWF4KqS/TmJP9ABEBAAG0
 G0phbmUgRG9lIDxqYW5lQGV4YW1wbGUub3JnPojMBBMBCgA2FiEEK8v49DttJG7D
 35BwcvTpbeNfCTgFAmVoj28CGwMECwkIBwQVCgkIBRYCAwEAAh4BAheAAAoJEHL0
 6W3jXwk4YLID/0arCzBy9utS8Q8g6FDtWyJVyifIvdloCvI7hqH51ZJ+Zb7ZLwwY
 /p08+Xnp4Ia0iliwqSHlD7j6M8eBy/JJORdypRKqRIbe0JQMBEcAOHbu2UCUR1jp
 jJTUnMHI0QHWQEeEkzH25og6ii8urtVGv1R2af3Bxi9k4DJwzzXc5Zch
 =8hwj
 -----END PGP PUBLIC KEY BLOCK-----

重要なのは、しなければならないキーブロックの各行を(少なくとも)1つのスペースでインデントすると、しなければならない空行の代わりにインデントを入れます.。(空行を削除するとキーが無効になります。) 上記のスクリプトはまさにそれを行います。

最後に、次のような正確なパスを指定するリポジトリがある場合、

deb [signed-by=/etc/apt/keyrings/EXAMPLE.gpg] https://example.com/apt deb/

DEB822の場合しなければならないセットSuites: deb/しなければならない)で終わり/してはならない線を引くComponents:

追加リソース

おすすめ記事