Apt update ругается NO_PUBKEY даже на официальные репозитории Ubuntu 24.04: ключ должен лежать в том keyring, что указан в Signed-By

Что было. На Ubuntu 24.04 apt update для основных репозиториев (noble, noble-updates, noble-security) выдал: «The following signatures couldn’t be verified because the public key is not available: NO_PUBKEY 871920D1991BC93C». Никаких сторонних репозиториев не добавляли.

Почему. Начиная с 24.04 источники описаны в /etc/apt/sources.list.d/ubuntu.sources в формате deb822, и для каждого указан Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg. apt проверяет подпись только ключами из этого файла. Если ключа в нём нет (повреждён пакет ubuntu-keyring, файл заменили при переносе системы, образ собран из старого шаблона), проверка падает, хотя тот же ключ может лежать в устаревшем /etc/apt/trusted.gpg. Автор убедился, что нужного ключа в keyring нет, и импортировал его именно туда:

sudo gpg --keyserver hkp://keyserver.ubuntu.com --no-default-keyring \
  --keyring /usr/share/keyrings/ubuntu-archive-keyring.gpg --recv-keys 871920D1991BC93C

apt update заработал. Подтверждено. Более чистый вариант: переустановить пакет с ключами (apt-get download ubuntu-keyring && dpkg -i ubuntu-keyring_*.deb), тогда файл вернётся к эталонному.

Общая схема для любого репозитория на современных Ubuntu и Debian.

  1. Ключ репозитория кладётся отдельным файлом: /etc/apt/keyrings/vendor.gpg (для сторонних) с правами 644. Скачивать по HTTPS с сайта поставщика и при возможности сверять отпечаток: gpg --show-keys vendor.gpg.
  2. В .sources или .list указывается Signed-By (или [signed-by=/etc/apt/keyrings/vendor.gpg]).
  3. apt-key устарел и удаляется: ключи из trusted.gpg доверяются всем репозиториям сразу, что и было причиной отказа от него.

Другие сообщения того же семейства.

  • EXPKEYSIG: ключ поставщика истёк, нужен свежий ключ с его сайта.
  • Release file … is not valid yet или expired: проблема с временем на машине или зеркало отдаёт старые метаданные; сначала timedatectl.
  • Conflicting values set for option Signed-By: один репозиторий описан дважды с разными ключами; убрать дубликат.

Проверка, что где лежит. apt-cache policy покажет источники; grep -r Signed-By /etc/apt/sources.list.d/ покажет, какие keyring ожидаются; gpg --no-default-keyring --keyring <файл> --list-keys покажет, какие ключи в них есть.

Формат источников описан в документации Ubuntu.