手当たり次第に書くんだ

飽きっぽいのは本能

Proxy 環境で apt-key adv –recv-keys がタイムアウトする原因 – GPG 鍵取得と外部通信を切り分ける

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

この記事では、Ubuntu 22.04 で apt-key adv --recv-keys がタイムアウトする原因を整理しつつ、現在は apt-key 方式ではなく、keyring ファイルと signed-by を使う方がよい、という読み替え方をまとめます。

前提

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

発生する問題

たとえば 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 のプロキシ設定を暫定策として扱い、恒久的には外部リポジトリの鍵管理を明示的に分離するのが安全です。

参考
書籍
参考書籍

Advanced Ubuntu Administration and Management Best Practices

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

Amazon で見る

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

関連記事

Proxy 環境で apt-key adv –recv-keys がタイムアウトする原因 – GPG 鍵取得と外部通信を切り分ける

コメントを残す

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

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

トップへ戻る