gh 指令在 Linux 突然更新不了?GitHub CLI 簽章金鑰 9 月 5 日到期,apt/dnf/yum/zypper 一步一步換掉
文章最後更新:2026-09-05
如果你在 Linux 上用 apt 或 dnf 裝過 GitHub 官方的 gh 指令,今天(2026 年 9 月 5 日)是一個要注意的日子:GitHub CLI 用來簽章 Linux 套件的 PGP 金鑰在今天到期。
到期之後,第一個新版本釋出時,套件庫資料會改用新金鑰簽章。系統上還留著舊金鑰的人,apt update 或 dnf update 就會開始報錯。
好消息是:這次 GitHub 是提早半年準備的——2026 年 4 月 8 日就把「同時含舊金鑰與新金鑰」的金鑰檔發布出去了。所以很多人其實已經自動安全了。
先確認:你到底有沒有中招
官方公告直接給了一張對照表,用白話翻過來:
| 你的情況 | 要不要處理 |
|---|---|
2026 年 4 月 8 日之後照官方文件安裝 gh | 不用,你的金鑰檔已經有新金鑰 |
4 月 8 日之前用 apt 裝的,之後沒重跑過安裝步驟 | 要處理 |
4 月 8 日之前用 dnf/yum/zypper 裝的,之後沒重跑 | 要處理 |
| 用 Homebrew、Conda、社群套件庫、直接下載執行檔或自己編譯 | 不用,這些方式不經過這把金鑰 |
| 用 Windows 或 macOS | 不用 |
| 想不起來自己什麼時候裝的 | 往下看「一行指令自己查」 |
一行指令自己查
Debian/Ubuntu(apt)
gpg --show-keys /etc/apt/keyrings/githubcli-archive-keyring.gpg
(找不到檔案的話,試舊路徑 /usr/share/keyrings/githubcli-archive-keyring.gpg;還是找不到就看 cat /etc/apt/sources.list.d/github-cli.list 裡 signed-by= 指到哪。)
怎麼看結果:輸出裡有兩把公鑰就沒事,只有一把(舊的那把)就要更新。兩把金鑰的指紋是:
- 舊金鑰(2026-09-05 到期):
2C6106201985B60E6C7AC87323F3D4EA75716059 - 新金鑰:
7F38BBB59D064DBCB3D84D725612B36462313325
Fedora/RHEL/CentOS/openSUSE/Amazon Linux 2(rpm)
rpm -qa gpg-pubkey | xargs -I{} sh -c 'rpm -qi {} | grep -q "[email protected]" && echo {}'
只列出一筆(舊金鑰)就要更新;有第二筆就代表新金鑰已經進來了。
修復步驟
Debian/Ubuntu
把金鑰檔換成官方最新版,然後更新:
sudo mkdir -p -m 755 /etc/apt/keyrings
sudo wget -qO /etc/apt/keyrings/githubcli-archive-keyring.gpg https://cli.github.com/packages/githubcli-archive-keyring.gpg \
&& sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg
sudo apt update
sudo apt install gh
沒有 wget 的話,用 curl -fsSL -o 取代那一行下載指令即可。
如果你的金鑰檔在別的位置(例如 /usr/share/keyrings/),記得把上面的路徑改成你實際的位置,並確認套件來源設定裡的 signed-by= 指的是同一個檔案。
Docker 映像檔建置失敗的話,把同一段下載指令寫進 Dockerfile 的 RUN 就好(容器裡通常本來就是 root,不用 sudo)。
根本沒在用 gh、只是基底映像檔剛好裝了:直接移掉這個套件來源,apt update 就不會再去驗證它:
sudo rm /etc/apt/sources.list.d/github-cli.list
Fedora 41 以上(DNF5)
sudo dnf config-manager addrepo --overwrite --from-repofile=https://cli.github.com/packages/rpm/gh-cli.repo
sudo dnf update gh
CentOS/RHEL/Fedora 40 以下(DNF4)
sudo dnf config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo dnf update gh
Amazon Linux 2(yum)
sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo yum update gh
openSUSE/SUSE(zypper)
sudo zypper removerepo gh-cli
sudo zypper addrepo https://cli.github.com/packages/rpm/gh-cli.repo
sudo zypper update gh
RPM 系統在最後升級時會跳出確認匯入金鑰的提示——這時候請比對指紋是不是上面那兩串,確認了再按同意。這一步不要跳過:確認指紋正是簽章機制的意義所在。
還是失敗?先把舊金鑰從 RPM 金鑰圈移掉
sudo rpm -qa gpg-pubkey
sudo rpm -qi gpg-pubkey-75716059-63172e8a
確認 Packager 欄位是 GitHub CLI <[email protected]> 之後再移除,然後重裝:
sudo rpm -e gpg-pubkey-75716059-63172e8a
sudo dnf remove gh
sudo dnf install gh
(用 yum 或 zypper 的人把指令換掉即可。)
你會看到的錯誤訊息長怎樣
官方列了幾種典型訊息,看到其中任一種就是這件事:
W: Failed to fetch https://cli.github.com/packages/dists/stable/InRelease
The following signatures were invalid: EXPKEYSIG 23F3D4EA75716059 GitHub CLI
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5612B36462313325
Transaction failed: Signature verification failed.
OpenPGP check for package ... from repo "gh-cli" has failed
Error: GPG check FAILED
為什麼會有這件事?
軟體套件庫用 PGP 金鑰簽章,是為了讓你的電腦能確認「這個檔案真的是 GitHub 發的、沒有被中途換掉」。金鑰有到期日,到期就得換一把。
上一次(2024 年 9 月)GitHub 的金鑰到期時是臨時延長舊金鑰來救火的,那次造成不少人安裝與更新失敗。這一次官方選擇提早半年換發新金鑰,並事先把新舊兩把一起發布——所以照官方文件近期裝過的人,什麼都不用做。
常見問題
我今天沒看到錯誤,是不是就沒事了?
不一定。官方說法是「到期日之後的第一個新版本釋出開始」,套件庫資料與新發布的 RPM 套件才會只用新金鑰簽章。所以你可能今天沒事、下週更新時才炸。與其等它壞,不如現在用上面那行指令查一下。
我用 Homebrew 裝的 gh,要處理嗎?
不用。Homebrew、Conda、社群套件庫、GitHub Releases 上的 .deb 檔或獨立執行檔,都不經過這把 PGP 金鑰。
這算資安事件嗎?我的機器有被入侵嗎?
不算,也沒有。這是例行的金鑰輪替,不是外洩事件。真正該警惕的反而是相反的情況:如果你為了讓錯誤消失而加上「跳過簽章驗證」的參數,那才是把自己暴露在風險裡。正確做法是換成新金鑰,不是關掉檢查。
資料來源:GitHub CLI 官方公告 issue #13118「Upcoming PGP signing key rotation for GitHub CLI Linux packages [September 2026]」(2026-04-08 發布,含自我檢查與各套件管理器修復步驟、金鑰指紋與錯誤訊息範例)、GitHub 官方更新紀錄「GitHub CLI Linux package signing key expires September 5」(2026-09-03);皆為 2026-09-05 直讀。 證據等級:官方一手(GitHub 官方公告與官方 changelog 兩份交叉)。 延伸:GitHub Copilot 工具頁、Copilot 內容排除設定教學

