Ubuntu24.04上に構築しているGitLabサーバーで、パッケージ更新のためにapt updateを実行したところ、GitLab関連のリポジトリで署名エラーが発生しました。
今回は、実際に発生したエラー内容、原因、対応方法を整理します。
はじめに
しばらく放置していたGitLabサーバーのバージョンを上げようとした際に、いくつかつまずいたので整理しておきます。
「細かい理屈はいいから、今すぐエラーを消したい」という場合は、以下のコマンドをコピーして実行してください。
curl -fsSL https://packages.gitlab.com/gpgkey/gpg.key | gpg --dearmor | sudo tee /usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg > /dev/null && sudo apt update
状況としては、Ubuntu24.04上にGitLabバージョン14が稼働していたので、最新バージョン18に上げようとしていました。その際に、以下の事象が発生したのです。
■発生した事象
GitLab サーバー上で、以下のコマンドを実行しました。
sudo apt update
すると、Ubuntu標準リポジトリやDockerリポジトリは正常に取得できていましたが、GitLab EEとGitLab Runnerのリポジトリで以下のエラーが発生しました。
The following signatures were invalid: EXPKEYSIG 3F01618A51312F3F GitLab B.V. (package repository signing key) <packages@gitlab.com>
対象となっていたリポジトリは以下です。
https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu
https://packages.gitlab.com/runner/gitlab-runner/ubuntu
エラーの内容から、GitLab の APT リポジトリ署名キーに問題があることが分かります。
■原因
原因は、APTがGitLabリポジトリの署名検証に使用しているGPG(GNU Privacy Guard)キーが古くなっていたことです。
GitLabのドキュメントを確認したところ、今年の2月に切れていたようです。このサーバーを構築したのが、2、3年前なので、当然古いキーを使っていたようですね。

APTは、外部リポジトリからパッケージ一覧を取得する際、そのリポジトリが信頼できるものかをGPGキーで検証します。
今回の環境では、GitLab EEとGitLab Runnerのリポジトリ定義は以下のようになっていました。
deb [signed-by=/usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg] https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu/ noble main
deb [signed-by=/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg] https://packages.gitlab.com/runner/gitlab-runner/ubuntu/ noble main
つまり、APTは以下のkeyringファイルを使って署名検証していました。
/usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg
/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg
最初に /etc/apt/keyrings/gitlab-keyring.asc に新しいキーを配置しましたが、リポジトリ定義ではそのファイルを参照していませんでした。
そのため、apt updateを再実行しても同じEXPKEYSIGエラーが発生しました。
■確認した内容
まず、GitLab関連のリポジトリ定義を確認しました。
grep -R "packages.gitlab.com" /etc/apt/sources.list.d/
出力結果から、GitLab EEとGitLab Runnerがそれぞれ以下のkeyringファイルを参照していることが分かりました。
/usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg
/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg
このため、実際に更新すべきなのは/etc/apt/keyrings/gitlab-keyring.ascではなく、上記2つの.gpgファイルでした。
■対応方法
GitLab EE用の古いkeyringファイルを削除し、GitLabのGPGキーを再取得して配置しました。
sudo rm -f /usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg
curl -fsSL https://packages.gitlab.com/gpgkey/gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg
次に、GitLab Runner用のkeyringファイルも同様に更新しました。
sudo rm -f /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg
curl -fsSL https://packages.gitlab.com/gpgkey/gpg.key \
| sudo gpg --dearmor -o /usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg
ここで実行しているgpg --dearmorは、取得したGPG公開鍵をAPTが利用しやすい.gpg形式に変換するための処理です。
■対応後の確認
再度、以下を実行しました。
apt update
対応後は、GitLab EEとGitLab Runnerのリポジトリ情報を正常に取得できました。
Get:6 https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu noble InRelease
Get:7 https://packages.gitlab.com/runner/gitlab-runner/ubuntu noble InRelease
Get:8 https://packages.gitlab.com/gitlab/gitlab-ee/ubuntu noble/main amd64 Packages
Get:9 https://packages.gitlab.com/runner/gitlab-runner/ubuntu noble/main amd64 Packages
最終的に、以下のようにエラーなく完了しました。
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
3 packages can be upgraded.
これにより、GitLab、GitLab Runnerのリポジトリ署名検証が正常に行われるようになりました。
まとめ
今回の事象は、GitLabのAPTリポジトリ署名キーが古くなっていたことにより、apt update実行時にEXPKEYSIGエラーが発生したものでした。
対応のポイントは、単に新しいGPGキーを取得するだけではなく、APTリポジトリ定義のsigned-byで指定されているkeyring ファイルを確認することです。
今回の環境では、以下の2つのファイルが実際に参照されていました。
/usr/share/keyrings/gitlab_gitlab-ee-archive-keyring.gpg
/usr/share/keyrings/runner_gitlab-runner-archive-keyring.gpg
そのため、これらのkeyringファイルを最新のGitLab GPGキーで更新することで、問題を解消できました。
GitLabやGitLab Runnerの更新時にEXPKEYSIGが発生した場合は、まず以下のコマンドでリポジトリ定義を確認すると、原因の切り分けがしやすいです。
grep -R "packages.gitlab.com" /etc/apt/sources.list.d/
参考リンク:GitLab公式ドキュメント
↓ほかの協栄情報メンバーのGitLabについての記事を公開しています。ぜひ参考にしてみてください。
■Amazon EC2を利用して、GitLabサーバを構築してみた【AWS】(齊藤弘樹)
■GitLabサーバにRunnerをインストールしてみた(齊藤弘樹)


