リポジトリのGPG鍵エラー - NO_PUBKEYと期限切れ署名
この記事で解決できること
apt updateで出る GPG error をNO_PUBKEYとEXPKEYSIGで正しく見分けられる- 不足している公開鍵を keyring に取得 し、
signed-by=で安全に紐付けできる - 非推奨の
apt-keyを避け、現行の鍵管理へ移行できる
結論(最短復旧)
NO_PUBKEY <KEYID>→ 公開鍵が手元に無い。鍵を取得して keyring に置くEXPKEYSIG/KEYEXPIRED→ 署名鍵が期限切れ。新しい鍵を取り直す- 配布元の HTTPS 公開鍵 URL から取得 →
gpg --dearmor→/etc/apt/keyrings/配置 →signed-by=が安全な型
前提(対象環境)
- OS: Ubuntu 20.04 以降 / Debian 11 以降
sudo実行権限あり- 対象は サードパーティ APT リポジトリ(公式リポジトリの鍵は専用セクション参照)
GPG鍵エラーとは何か?なぜ起きる?
結論: APT はパッケージの署名を公開鍵で検証する。鍵が手元に無い・期限切れ・別鍵に交代した場合に
apt updateが GPG error を出す。
APT は「リポジトリの Release ファイルが正規の鍵で署名されているか」を毎回検証する(secure apt)。検証に失敗すると更新を拒否し、警告を表示する。原因は大きく 3 系統に分かれる。
| エラー文言 | 意味 | 主因 |
|---|---|---|
NO_PUBKEY <KEYID> |
対応する公開鍵が手元に無い | リポジトリ追加時に鍵を入れ忘れ / 鍵が消えた |
EXPKEYSIG <KEYID> |
署名は鍵由来だが、その鍵が期限切れ | 配布元の署名鍵の有効期限切れ |
KEYEXPIRED <UNIX時刻> |
鍵の有効期限が過ぎている | 同上(gpg 側の表現) |
典型的な出力は次のようになる。
W: GPG error: https://repo.example.com stable InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 871920D1991BC93C E: The repository 'https://repo.example.com stable InRelease' is not signed.
警告を消すために署名検証を無効化する(trusted=yes や --allow-unauthenticated)のは改ざんパッケージを掴むリスクを負う。原則として鍵を正しく入れて直す。
NO_PUBKEY エラーはどう直す?
結論: エラー文言の
KEYIDを控え、配布元の公開鍵を取得して keyring に置く。配布元が HTTPS で鍵を公開していれば、その URL から取るのが最も安全。
1. 不足している鍵 ID を特定する
エラー末尾の NO_PUBKEY に続く 16 桁(または 8 桁)の 16 進数が鍵 ID。上の例では 871920D1991BC93C。
2. 配布元の公開鍵 URL から取得する(推奨)
多くの配布元は .gpg または .asc の公開鍵を HTTPS で配布している。これを gpg --dearmor でバイナリ keyring に変換して置く。
$ curl -fsSL https://repo.example.com/gpg.key \ | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg
--dearmor は ASCII 形式(-----BEGIN PGP PUBLIC KEY-----)をバイナリ keyring に変換する。すでにバイナリの .gpg なら curl -fsSL ... -o /etc/apt/keyrings/example.gpg で直接保存してよい。
3. sources エントリに signed-by を付ける
鍵を「どのリポジトリの検証に使うか」を signed-by= で明示する(詳細)。
$ echo "deb [signed-by=/etc/apt/keyrings/example.gpg] https://repo.example.com stable main" \ | sudo tee /etc/apt/sources.list.d/example.list $ sudo apt update
鍵 ID しか分からない場合:keyserver から取得
配布元 URL が分からず鍵 ID だけ判明しているときは、keyserver から直接 keyring に受信する。
$ sudo gpg --no-default-keyring \ --keyring /etc/apt/keyrings/example.gpg \ --keyserver keyserver.ubuntu.com \ --recv-keys 871920D1991BC93C
keyserver 経由は「その鍵 ID が本当に配布元の正規鍵か」を自分で保証できない。可能な限り配布元の HTTPS URL から取得する方を選ぶ。
期限切れ署名(EXPKEYSIG / KEYEXPIRED)はどう直す?
結論: 期限切れは「鍵が無い」のではなく「同じ鍵の有効期限が過ぎた」状態。配布元が更新した最新の公開鍵を取り直して上書きすれば直る。
出力は次のようになる。
W: GPG error: https://repo.example.com stable InRelease: The following signatures were invalid: EXPKEYSIG 871920D1991BC93C Example Repo Signing Key
対処は NO_PUBKEY とほぼ同じで、最新鍵で keyring を上書きする。配布元は期限を延長した同じ鍵、または後継鍵を再配布していることが多い。
# 最新の公開鍵を取り直して上書き $ curl -fsSL https://repo.example.com/gpg.key \ | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg $ sudo apt update
取得した鍵の有効期限は次で確認できる。[expired] や expires: 行を見る。
$ gpg --show-keys /etc/apt/keyrings/example.gpg
配布元がまだ鍵を更新していない場合、こちら側では直せない。配布元のアナウンス・リポジトリの案内ページを確認する。
apt-key は使ってはいけないのか?
結論:
apt-keyは Ubuntu 20.04 / Debian 11 以降で非推奨。新しい手順では使わず、keyring ファイル +signed-by=に移行する。
apt-key adv --recv-keys ... という古い記事を見かけるが、apt-key は廃止予定で、新しい鍵を全リポジトリで信頼される単一の鍵束に入れてしまう設計上のリスクがある(ある配布元の鍵で別の配布元のパッケージも検証が通る)。
現行の正解は、鍵を個別ファイルに分け、signed-by= で対象リポジトリだけに効かせること。
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
この警告が出たら、次セクションの方式へ移行する。
signed-by で鍵を正しく配置するには?
結論: 鍵は
/etc/apt/keyrings/に置き、sources エントリの[signed-by=...]でフルパス指定する。ファイルは 644 以上の読み取り権限が必要。
配置場所と権限
| 項目 | 推奨 |
|---|---|
| 鍵の配置先 | /etc/apt/keyrings/(無ければ sudo install -d -m 0755 /etc/apt/keyrings) |
| 鍵ファイル形式 | gpg --dearmor 済みバイナリ |
| ファイル権限 | 644 以上(root 以外も読める) |
keyring ファイルの権限が 600 などで root しか読めないと、_apt ユーザーが鍵を読めず NO_PUBKEY が直らない。sudo chmod 644 /etc/apt/keyrings/example.gpg で確認する。
sources エントリ(1 行形式)
deb [signed-by=/etc/apt/keyrings/example.gpg] https://repo.example.com stable main
sources エントリ(deb822 形式 / .sources)
新しい Ubuntu / Debian では deb822 形式も使える。Signed-By: に同じパスを書く。
$ sudo tee /etc/apt/sources.list.d/example.sources > /dev/null <<'EOF' Types: deb URIs: https://repo.example.com Suites: stable Components: main Signed-By: /etc/apt/keyrings/example.gpg EOF
Ubuntu 公式リポジトリの鍵が期限切れの場合は?
結論: 公式アーカイブの鍵は
ubuntu-keyring(Debian はdebian-archive-keyring)パッケージで管理される。更新すれば最新の鍵が入る。
サードパーティではなく Ubuntu/Debian 公式リポジトリ自体で鍵エラーが出る場合は、鍵束パッケージの更新を試す。
# Ubuntu $ sudo apt install --reinstall ubuntu-keyring # Debian $ sudo apt install --reinstall debian-archive-keyring
apt update 自体が鍵エラーで失敗していると上記もダウンロードできないことがある。その場合は配布元の鍵更新アナウンスを確認し、信頼できる経路で新しい *-keyring パッケージ(.deb)を入手して sudo dpkg -i で導入する。
トラブルシュート早見表
結論: エラー文言で原因の系統が決まる。NO_PUBKEY は取得、EXPKEYSIG は取り直し、権限・パスの取りこぼしを最後に確認する。
| 症状 | 確認 | 対処 |
|---|---|---|
NO_PUBKEY <KEYID> |
鍵 ID を控える | 配布元 URL or keyserver から取得して keyring へ |
EXPKEYSIG / KEYEXPIRED |
gpg --show-keys で期限確認 |
最新鍵で keyring を上書き |
| 鍵を入れたのに直らない | ls -l /etc/apt/keyrings/ |
権限を 644 以上に(chmod 644) |
| 鍵を入れたのに直らない | sources の signed-by= パス |
keyring のフルパスと一致させる |
apt-key is deprecated |
— | keyring + signed-by= へ移行 |
| 公式リポジトリで発生 | — | ubuntu-keyring / debian-archive-keyring を再インストール |
やってはいけないこと
[trusted=yes]や--allow-unauthenticatedで検証を無効化したまま運用する- 出所不明の鍵 ID を keyserver から取り込んで全体に信頼させる
apt-key addで新規に鍵を追加する(非推奨・全体信頼のリスク)