1643 字
8 分鐘

GitHub CLI Linux 金鑰到期怎麼辦?重新載入 APT/RPM keyring

GitHub CLI(gh)的 Linux 套件簽章金鑰在 2026 年 9 月 5 日到期。這不是 gh 指令本身突然不能執行,而是使用官方 APT 或 RPM repository 的主機,可能在下一次套件 metadata 或新版本下載時遇到簽章驗證錯誤。

受影響的是 2026 年 4 月 8 日以前安裝官方 APT/RPM 套件、之後沒有重新執行安裝設定的環境。較晚才安裝的官方套件通常已包含新 key;Windows、macOS、Homebrew、Conda、source build、community package、standalone binary 與直接下載的 .deb 不在這次輪替範圍內。先確認安裝來源,再決定是否需要更新 keyring。

先判斷你的 gh 是否受影響#

安裝方式這次是否需要處理
官方 APT/RPM,2026-04-08 前安裝,從未重新執行 setup很可能需要,先檢查 keyring 指紋
官方 APT/RPM,2026-04-08 後安裝,或已重新執行 setup通常已含新 key,仍可照本文驗證
Windows、macOS、Homebrew、Conda、source build不受這次 Linux repository key rotation 影響
community package、standalone binary、直接下載 .deb不使用該官方 APT/RPM metadata 簽章流程
不確定安裝來源先執行 gh —version,再檢查 repository 與 keyring,不要直接重裝未知套件

如果錯誤訊息包含 EXPKEYSIG、NO_PUBKEY、repository is not signed 或 metadata signature verification failed,優先處理 keyring 與 repository 指向,不要先關閉 APT/DNF 的簽章驗證。

先確認系統目前信任哪把 key#

官方新 keyring 應同時包含舊、新兩個 fingerprint。可以先在 Debian/Ubuntu 檢查常見路徑:

Terminal window
gpg --show-keys --with-fingerprint /etc/apt/keyrings/githubcli-archive-keyring.gpg
gpg --show-keys --with-fingerprint /usr/share/keyrings/githubcli-archive-keyring.gpg
sed -n '1,80p' /etc/apt/sources.list.d/github-cli.list

實際存在的 keyring 路徑依安裝方式而異;不要因為第一個路徑不存在就建立第二份相似檔案。檢查 github-cli.list 裡的 signed-by,讓它和你驗證過的 keyring 路徑一致。

這次輪替應看到的 fingerprint 是:

  • 舊 key:2C6106201985B60E6C7AC87323F3D4EA75716059。
  • 新 key:7F38BBB59D064DBCB3D84D725612B36462313325。

兩把都出現,代表 keyring 已能覆蓋輪替期間的套件;只看到舊 key,或 fingerprint 不在官方文件列出的值中,就應重新下載官方 keyring。不要把任意 keyserver 回傳的 key 視為可信來源。

RPM 系統可以先列出套件資料庫裡標示為 GitHub CLI 的公鑰:

Terminal window
for key in $(rpm -qa gpg-pubkey); do
rpm -qi "$key" | grep -q '[email protected]' && rpm -qi "$key"
done

確認 Packager 是 GitHub CLI 的官方識別後,再檢查是否同時有新、舊 fingerprint。不要在還沒核對 fingerprint 和 Packager 前刪除 gpg-pubkey;刪錯可能影響同一台主機上的其他 repository。

Debian/Ubuntu:重新下載官方 keyring#

如果 APT keyring 只有舊 key,使用 GitHub CLI 官方提供的 keyring URL 覆寫該 repository 實際使用的檔案:

Terminal window
sudo mkdir -p -m 755 /etc/apt/keyrings
sudo curl -fsSL -o /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

如果 github-cli.list 的 signed-by 指向 /usr/share/keyrings,就把下載目標改成那個既有路徑,或同步修正 source list 後再執行 apt update。修正後重新執行 gpg —show-keys —with-fingerprint,確認 fingerprint,而不是只看 apt update 沒有紅字。

Dockerfile 也要在 apt-get update 之前載入新 keyring,否則本機修好但 CI build 仍會失敗:

RUN mkdir -p -m 755 /etc/apt/keyrings \
&& curl -fsSL -o /etc/apt/keyrings/githubcli-archive-keyring.gpg \
https://cli.github.com/packages/githubcli-archive-keyring.gpg \
&& chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg

若某個 image 根本不需要 gh,移除不用的 GitHub CLI repository 也是合理做法;不要用 allow-unauthenticated 或關閉 repository signature 來繞過錯誤。

Fedora、RHEL、CentOS:重新載入 RPM repository#

RPM 系統的做法是重新取得官方 repo file,讓新的 gpgkey 設定寫入 repository。依系統使用的工具選一組:

Terminal window
# DNF5
sudo dnf config-manager addrepo --overwrite \
--from-repofile=https://cli.github.com/packages/rpm/gh-cli.repo
sudo dnf update gh
# DNF4
sudo dnf config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo dnf update gh
# yum
sudo yum-config-manager --add-repo https://cli.github.com/packages/rpm/gh-cli.repo
sudo yum update gh

如果使用 zypper,先移除現有的 gh-cli repository,再以官方 repo URL 重新加入後更新:

Terminal window
sudo zypper removerepo gh-cli
sudo zypper addrepo https://cli.github.com/packages/rpm/gh-cli.repo gh-cli
sudo zypper refresh
sudo zypper update gh

系統可能提示匯入新的 signing key。先比對 fingerprint 與 Packager,再接受;如果更新後仍失敗,才回頭用 rpm -qa gpg-pubkey 找出仍被信任的舊 key,確認它確實屬於 GitHub CLI 後再依官方說明移除並重裝。

重新更新後如何驗證#

套件更新完成後,至少在同一台主機上做三層確認:

Terminal window
gh --version
apt-cache policy gh
dnf info gh

Debian/Ubuntu 只需執行 apt-cache,RPM 系統只需執行 dnf info。你應看到套件可以從預期的官方來源解析,apt update 或 dnf refresh 不再出現 EXPKEYSIG、NO_PUBKEY 或 unsigned repository;CI image 則要重新 build 一次,確認沒有沿用舊 layer。

若 gh 是由 runner image、cloud-init 或 Ansible 安裝,請把新的 keyring 載入步驟放回 provisioning code,並讓主機重建一次。只在現有 VM 手動修好,下一批 autoscaling runner 仍可能帶著過期 key。

這次不要採用的解法#

  • 不要用 apt 的 allow-unauthenticated、跳過 GPG check 或 DNF 的弱化驗證旗標。
  • 不要從不明 keyserver 匯入看似相近的 GitHub key。
  • 不要為了避開 repository 錯誤,改裝未驗證來源的 community gh package。
  • 不要在沒有確認 Packager 與 fingerprint 前刪除所有 gpg-pubkey。
  • 不要只修本機;把 keyring、source list 和 Docker/runner provisioning 一起納入版本控制與重建測試。

結論:更新 keyring,不要繞過簽章#

這次 GitHub CLI Linux 金鑰輪替的核心是讓官方 APT/RPM repository 重新信任正確 key。先辨識安裝來源,再檢查舊、新 fingerprint;確認 signed-by 或 repo file 指向官方 keyring,最後用 package manager 與 CI image 做一次完整更新。這樣才能同時修復開發機、self-hosted runner 和 Docker build,而不會把安全驗證變成被繞過的設定。

這類 Linux 套件問題和 GitHub Codespaces port forwarding 的安全設定 一樣,重點不是讓指令「先跑起來」,而是確認信任邊界仍指向可驗證的官方來源。

常見問題#

Q: macOS 或 Windows 也要更新這把 key 嗎?#

A: 不需要。這次輪替針對 GitHub CLI 官方 Linux APT/RPM package signing key;macOS、Windows 與不使用該 repository metadata 的安裝方式不在影響範圍內。

Q: keyring 只有新 fingerprint,沒有舊 fingerprint,算成功嗎?#

A: 先確認你下載的是官方 keyring,且檔案沒有被錯誤替換。官方輪替資訊預期新 keyring 能涵蓋舊、新 key;若只有一把,請重新檢查實際 signed-by 路徑與安裝文件,不要只因 apt update 暫時成功就忽略。

Q: 直接下載 standalone gh binary 可以避開問題嗎?#

A: 可以避開 APT/RPM repository 的 metadata 簽章流程,但不代表任何來源都可信,也不會修好 Dockerfile 或 runner provisioning 的 repository 設定。若團隊原本使用官方 package,優先更新 keyring 並保留套件管理。

參考資料:

GitHub Changelog:GitHub CLI Linux package signing key 將於 9 月 5 日到期

GitHub CLI issue:Upcoming PGP signing key rotation

GitHub CLI Docs:Installing GitHub CLI on Linux

GitHub CLI Linux 金鑰到期怎麼辦?重新載入 APT/RPM keyring
https://laplusda.com/posts/github-cli-linux-signing-key-rotation/
作者
Zero
發佈於
2026-09-05
許可協議
CC BY-NC-SA 4.0
這篇文章有幫助嗎?

回報錯字、失效連結,或告訴我你想看的延伸主題。