Apt предупреждает, что ключи в trusted.gpg.d игнорируются, а скопированный в keyrings ключ не принимается: куда и в каком формате класть ключи репозиториев

Что было. Две связанные истории. В первой при apt-get update предупреждение: The key(s) in the keyring /etc/apt/trusted.gpg.d/vendor.asc are ignored as the file is not readable by user '_apt' (или просто «ignored»). Во второй администратор перенёс ключ из trusted.gpg.d в /usr/share/keyrings/, но apt отверг файл.

Причины.

  1. /etc/apt/trusted.gpg.d/ это устаревшее место: ключи оттуда доверяются всем репозиториям сразу, поэтому новые версии apt предупреждают о них, а источники в формате deb822 их не используют, если указан Signed-By. Ключи, на которые не ссылается ни один источник, «игнорируются».
  2. Файлы ключей в ASCII-формате (.asc, начинаются с -----BEGIN PGP PUBLIC KEY BLOCK-----) apt в Signed-By принимает только начиная с определённых версий, и то с расширением .asc; бинарный .gpg работает везде. Простое копирование .asc под именем .gpg не работает. Автор второй истории получил рабочий файл, прогнав ключ через gpg --dearmor при скачивании. Обе истории подтверждены.

Правильная последовательность для стороннего репозитория.

sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://repo.example.com/keys/example.asc | gpg --dearmor | sudo tee /etc/apt/keyrings/example.gpg >/dev/null
sudo chmod 644 /etc/apt/keyrings/example.gpg

Источник в /etc/apt/sources.list.d/example.sources:

Types: deb
URIs: https://repo.example.com/debian
Suites: bookworm
Components: main
Signed-By: /etc/apt/keyrings/example.gpg

Проверка ключа до установки: gpg --show-keys /etc/apt/keyrings/example.gpg и сравнение отпечатка с опубликованным поставщиком. /etc/apt/keyrings/ для ключей, добавленных администратором; /usr/share/keyrings/ для ключей из пакетов.

Как навести порядок в существующей системе.

  1. ls /etc/apt/trusted.gpg.d/ и apt-key list (пока команда существует): что лежит в устаревших местах.
  2. Для каждого ключа найти репозиторий (grep -r URIs\|^deb /etc/apt/sources.list*) и перевести его на Signed-By.
  3. Убрать ключи из trusted.gpg.d и удалить /etc/apt/trusted.gpg, если он есть.
  4. apt update без предупреждений.

Почему это не только косметика. Ключ в trusted.gpg.d подписывает любой репозиторий: если один из сторонних репозиториев скомпрометирован, его подпись примут и для пакетов, «притворяющихся» системными. Signed-By привязывает ключ к одному источнику.

Схема описана в документации Debian.