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 proxyAnsible で考える場合
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 アソシエイトリンクです。
関連記事
- Ubuntu 22.04 MOTD NEWS の外部通信を停止する – ログイン時の不要な通信を抑える
- Ubuntu 22.04 apt update, apt upgrage 手動システムアップデート
- Ubuntu 22.04 unattended-upgrades 自動システムアップデート
- Ubuntu 22.04 Squid フォワードプロキシ – 出口制御と許可ネットワークの設計
- Ubuntu 22.04 update-ca-certificates – 内部 CA と自己署名証明書を信頼する
- Ubuntu 22.04 設定マニュアル




