手当たり次第に書くんだ

飽きっぽいのは本能

Ubuntu 22.04 Proxy 環境の GPG 鍵取得 – apt-key のタイムアウトを切り分ける

Proxy 環境で apt-key adv --recv-keys がタイムアウトすることがあります。APT のプロキシ設定が効いているように見えても、GPG 鍵取得の通信経路では別の仕組みが使われるためです。

この記事は、Ubuntu 22.04 の既存環境で外部リポジトリの GPG 鍵取得を見直すための記事です。現在は apt-key 方式を前提にし続けるのではなく、keyring ファイルと signed-by を使う方式へ読み替えるのが基本です。

関連する記事
この記事で確認すること
  • APT と GPG 鍵取得の通信経路の違い
  • apt-key adv がタイムアウトする理由
  • 古い方式を通す場合の暫定対応
  • keyring と signed-by への読み替え
  • Proxy 環境での切り分け順序
参考
書籍
参考書籍

Advanced Ubuntu Administration and Management Best Practices

Ubuntu Server の運用項目を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。

Amazon で見る

このリンクは Amazon アソシエイトリンクです。

前提

  • インターネットへの直接通信は禁止され、プロキシ経由で外部へ出る環境
  • APT のプロキシ設定は入っている
  • PPA や外部リポジトリ追加時に GPG 鍵取得が必要になる
  • Ansible などの構成管理からリポジトリ追加を自動化している

22.04 の既存環境では、古い apt-key 前提の手順が残っていることがあります。問題を通すだけでなく、現在の鍵管理方式へ読み替えられるかを確認します。

発生する問題

たとえば Ansible の apt_repository などから PPA を追加すると、内部で apt-key adv --recv-keys が呼ばれることがあります。その際、次のようなエラーで停止します。

出力例
fatal: [target-host]: FAILED! => {
  "cmd": "/usr/bin/apt-key adv --recv-keys ...",
  "msg": "gpg: keyserver receive failed: Connection timed out"
}

このとき、APT の Acquire::http::Proxy が設定されていても、GPG 鍵取得側の通信がその設定を参照せず、キーサーバーへ直接通信しようとしてタイムアウトすることがあります。

APT と dirmngr の通信経路

apt-key adv は GnuPG を使い、その内部で dirmngr がキーサーバーへ接続します。APT のパッケージ取得と、GPG のキーサーバー通信は同じ経路ではありません。

流れ
apt / apt-add-repository
  -> apt-key adv
      -> gpg
          -> dirmngr
              -> keyserver.ubuntu.com へ通信

そのため、APT 側にプロキシを設定していても、dirmngr がプロキシを知らない場合は外部へ到達できません。Proxy 配下では、この差分がタイムアウトとして見えます。

apt-key は現在の基本方式ではない

ここで重要なのは、dirmngr にプロキシを設定すれば一応回避できる、というだけで終わらせないことです。apt-key は現在では非推奨の扱いであり、新しい外部リポジトリ設定では keyring ファイルを配置し、リポジトリ定義側で signed-by を指定する方式が基本です。

方式位置づけ扱い
apt-key adv --recv-keysキーサーバーから鍵を取得する古い方式既存手順の理解用にする
dirmngr.conf にプロキシ設定古い方式を通すための回避策必要な場合の暫定対応
keyring + signed-by鍵ファイルとリポジトリを対応付ける方式こちらを基本にする

古い方式を通す場合の暫定対応

既存の手順や古い Ansible タスクをすぐに直せない場合、dirmngr にプロキシを設定することで回避できることがあります。プロキシ URL は環境に合わせて変更します。

コマンド
sudo mkdir -p /etc/gnupg
sudo tee /etc/gnupg/dirmngr.conf >/dev/null <<'EOF'
http-proxy http://proxy.example.com:8080
EOF

この対応は、古い apt-key adv 方式を通すための暫定策です。恒久対応としては、次の keyring 方式へ寄せます。

keyring と signed-by を使う

現在の外部リポジトリ追加では、公開鍵を keyring ファイルとして配置し、リポジトリ定義で signed-by を指定します。これにより、どのリポジトリがどの鍵で検証されるかが明確になります。

コマンド
curl -fsSL https://example.com/repository.gpg | sudo gpg --dearmor -o /usr/share/keyrings/example-archive-keyring.gpg
sudo tee /etc/apt/sources.list.d/example.list >/dev/null <<'EOF'
deb [signed-by=/usr/share/keyrings/example-archive-keyring.gpg] https://example.com/apt stable main
EOF
sudo apt update

プロキシ環境では、curl 側のプロキシ設定、APT 側のプロキシ設定、DNS、ファイアウォールを分けて確認します。

切り分けの順序

  • DNS で対象ホスト名を解決できるか確認する
  • プロキシ経由で HTTPS 取得できるか確認する
  • APT のプロキシ設定が入っているか確認する
  • apt-key adv が使われている古い手順か確認する
  • 古い手順なら dirmngr のプロキシ設定で暫定回避できるか確認する
  • 恒久的には keyring と signed-by 方式へ移行する
コマンド
getent hosts keyserver.ubuntu.com
curl -I https://keyserver.ubuntu.com
apt-config dump | grep -i proxy

Ansible で考える場合

Ansible で管理している場合も、古い apt_repository の PPA 追加に依存し続けるより、鍵ファイル配置、リポジトリファイル配置、apt update を分けた方が見通しが良くなります。

実際の Playbook では、公開鍵の取得、gpg --dearmor/usr/share/keyrings への配置、sources.list.d への定義配置を明示的に分けると、どこで失敗しているか切り分けやすくなります。

まとめ

Proxy 環境で apt-key adv --recv-keys がタイムアウトする原因は、APT のプロキシ設定と GPG / dirmngr の通信経路が別であることにあります。

ただし、現在は apt-key 自体を前提にし続けるより、keyring ファイルと signed-by を使う方式へ移行した方がよいです。古い手順を通す必要がある場合だけ dirmngr.conf のプロキシ設定を暫定策として扱い、恒久的には外部リポジトリの鍵管理を明示的に分離するのが安全です。

関連する記事
Ubuntu 22.04 Proxy 環境の GPG 鍵取得 – apt-key のタイムアウトを切り分ける

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

トップへ戻る