アップデートが失敗する理由
パッケージのアップデート中に問題が発生した場合、おそらく次のような大量のテキストが表示されているはずです。
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://repo.example.com/debian stable InRelease: The following signatures were invalid: EXPKEYSIG 40976EAF437D05B5
W: Failed to fetch http://repo.example.com/debian/dists/stable/InRelease The following signatures were invalid: EXPKEYSIG 40976EAF437D05B5
W: Some index files failed to download. They have been ignored, or old ones used instead.
根本的な原因
Linux ディストリビューションは、リポジトリパッケージの署名に GPG (GNU Privacy Guard) キーを使用しています。この検証プロセスにより、ダウンロードしたコードが第三者によって改ざんされていないことが保証されます。セキュリティ基準を維持するため、これらのキーの多くには有効期限があり、通常 2 〜 5 年ごとに期限切れになります。
EXPKEYSIG エラーは、ローカルシステムに古い公開キーが保存されている場合に発生します。また、リポジトリの管理者が新しいキーを発行したものの、メタデータが正しく更新されていない場合にも起こり得ます。これは重要なセキュリティ機能ですが、深夜 2 時の重要な依存関係のインストールを妨げられると非常に厄介です。システムを正常な状態に戻しましょう。
解決策 1:キーサーバー経由で更新する(従来の方法)
Ubuntu や Debian などの標準的なリポジトリは、多くの場合、公開キーサーバーを使用しています。エラーメッセージに表示されている 8 桁または 16 桁の ID を使用して、最新のキーをプルできます。今回の例では、その ID は 40976EAF437D05B5(これは Ubuntu Archive Master Signing Key です)です。
ターミナルに表示された ID に置き換えて、次のコマンドを実行してください。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
キーが更新されたことが確認できたら、再度アップデートを試みてください。
sudo apt update
注:新しいシステムでは「deprecated(非推奨)」という警告が表示される場合があります。その場合は、解決策 2 に進んでください。
解決策 2:最新の GPG 手法(Ubuntu 22.04 以降および Debian 12)
最新の Linux バージョンでは apt-key の使用が廃止されつつあります。代わりに、キーは /usr/share/keyrings/ または /etc/apt/trusted.gpg.d/ に保存されます。これによりセキュリティが向上し、グローバルな信頼ストアをクリーンに保つことができます。
手動でキーをエクスポートするには、以下の手順に従ってください。
# ローカルの GPG キーリングにキーを受信する
gpg --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5
# APT が認識できる形式で信頼済みディレクトリにエクスポートする
gpg --export 40976EAF437D05B5 | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/renewed-key.gpg
まだエラーが表示されますか? /etc/apt/sources.list.d/ 内の特定の .list ファイルを確認してください。新しい .gpg ファイルを指す signed-by フラグが含まれていることを確認します。
解決策 3:サードパーティ製リポジトリ(Docker、Google、Node)の修正
Google や Docker などのベンダーは、必ずしも Ubuntu のキーサーバーを使用しているわけではありません。彼らは独自のキーファイルをホストしています。上記の手順で解決しない場合は、プロバイダーから直接キーをダウンロードする必要があります。
Google Chrome または Cloud SDK のエラーを修正する場合:
curl https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/google.gpg
Docker リポジトリのエラーを修正する場合:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
解決策 4:一度削除して再追加する(クリーンな状態にする)
ローカルのキーリングに、同じキーの競合する複数のバージョンが含まれていると、破損することがあります。ループに陥った場合は、古いキーを完全に削除してから再追加してみてください。
- キー名を確認する:
apt-key list - 期限切れのキーを削除する:
sudo apt-key del 40976EAF437D05B5 - 解決策 1 または 2 のインポートコマンドを再実行する。
検証:修正の確認
すべてが同期されていることを確認するために、次の一連のコマンドを実行します。
sudo apt clean
sudo apt update
成功すると、「パッケージリストを読み込んでいます... 完了」というクリーンなメッセージが表示されます。GPG に関して「W:」や「E:」で始まる行が表示されなければ、署名は有効であり、システムは安全です。
事前のメンテナンス
キーの期限切れは、サーバーメンテナンスにおける日常的な作業です。いくつかの簡単な習慣を身につけることで、これらのエラーを未然に防ぐことができます。まず、システムを毎週アップデートしましょう。アップデートには、有効期限を延長する新しいキーリングパッケージが含まれていることがよくあります。
次に、HashiCorp や NodeSource などのベンダーが提供する公式のインストールスクリプトを使用してください。これらのスクリプトには通常、キーリングのローテーションを自動的に処理するロジックが含まれています。最後に、複数のサーバーを管理している場合は、ログに「W:」という文字列がないか監視し、デプロイパイプラインが停止する前に期限切れのキーを検知できるようにしましょう。

