Решение проблем с подписью пакетов в Arch Linux: ключи, синхронизация времени и работа с archlinux-keyring

Когда pacman -Syu начинает жаловаться на «подпись недействительна» или «непоследовательная база данных», даже опытные пользователи Arch Linux могут ощутить легкий мандраж. Эти ошибки часто возникают после длительного периода без обновлений, смены ключей разработчиков или при первом запуске на свежей установке. Разберемся, как работать с инфраструктурой PGP-ключей Arch и вернуть систему в рабочее состояние.

Почему ключи устаревают

Система подписей в Arch — это два слоя защиты:

  1. Базовая синхронизация через archlinux-keyring, содержащая доверенные ключи разработчиков
  2. Индивидуальные подписи пакетов, проверяемые через механизм pacman-key

Ключи имеют ограниченный срок действия (обычно 1-2 года). Когда обновление archlinux-keyring происходит с задержкой, pacman теряет доверие к новым подписям пакетов, созданным более свежими ключами. Это не баг, а осознанный компромисс между безопасностью и удобством.

Типичный сценарий восстановления

Допустим, вы видите:

text
error: python: signature from "Levente Polyak (anthraxx) <levente@leventepolyak.net>" is unknown trust
:: File /var/cache/pacman/pkg/python-3.11.5-1-x86_64.pkg.tar.zst is corrupted (invalid or corrupted package (PGP signature)).

Шаг 1: Обновление временных меток

Первое, что нужно проверить — синхронизацию времени. Некорректное системное время делает PGP-подписи недействительными:

bash
timedatectl set-ntp true
hwclock --hctosys
date  # проверьте вывод

Шаг 2: Принудительное обновление ключевых пакетов

Пропустите проверку подписи для самого archlinux-keyring:

bash
pacman -Sy archlinux-keyring --needed --disable-download-timeout
pacman -Syu --ignore archlinux-keyring

Флаг --ignore позволяет обойти цикл зависимостей между ключами и пакетами.

Шаг 3: Перезагрузка trustdb

После обновления ключевого пакета необходимо перестроить базу доверия:

bash
pacman-key --init
pacman-key --populate archlinux
pacman-key --refresh-keys

Особое внимание на вывод команды --refresh-keys. Если процесс зависает на определенном ключе, это может указывать на проблемы с сервером ключей. Используйте параметр --keyserver hkps://keys.openpgp.org для явного указания сервера.

Автоматизация профилактики

Чтобы предотвратить проблемы в будущем, добавьте в cron задачу для регулярного обновления:

text
0 */6 * * * /usr/bin/pacman -Sy archlinux-keyring && /usr/bin/pacman-key --refresh-keys

Если вы используете systemd-таймер:

bash
# /etc/systemd/system/arch-keyring-update.timer
[Unit]
Description=Refresh archlinux-keyring every 6h

[Timer]
OnCalendar=*-*-* 0/6:00:00
Persistent=true

[Install]
WantedBy=timers.target

Глубокое погружение: механизм pacman-key

Структура доверия Arch базируется на нескольких ключевых компонентах:

  1. /etc/pacman.d/gnupg — хранилище GPG-ключей
  2. /usr/share/pacman/keyrings/ — предустановленные мастер-ключи
  3. pacman-key --list-sigs — просмотр текущих доверенных подписей

При ручном добавлении ключа (например, для сторонних репозиториев) используйте:

bash
curl -s https://api.project.com/key.asc | pacman-key --add -
pacman-key --lsign-key KEYID

Важно всегда локально подписывать (--lsign) импортированные ключи, чтобы избежать атак через SHA1-коллизии.

Когда всё идет не по плану: экстренные меры

Если стандартные методы не помогают:

  1. Получите свежий список зеркал через reflector:

    bash
    reflector --latest 10 --protocol https --sort rate --save /etc/pacman.d/mirrorlist
    
  2. Используйте аппаратные часы в UTC:

    bash
    timedatectl set-local-rc-time 0
    
  3. Ручное обновление через HTTP (временно отключите проверку):

    bash
    pacman -Sy --config /etc/pacman.conf.force ... 
    

    Где pacman.conf.force содержит:

    text
    SigLevel = Never
    

Этот метод годится только для первоначального восстановления, после чего нужно немедленно вернуть стандартные настройки подписей.

Заключение

Сбои в механизме подписей — неотъемлемая часть философии Arch Linux, где пользователь добровольно берет на себя ответственность за поддержание системы в актуальном состоянии. Регулярный pacman -Syu (рекомендуется не реже раза в неделю) и понимание структуры ключей разработчиков избавляет от 95% проблем.

Для критически важных систем рассмотрите использование LTS-версий ключевых пакетов или развертывание локного зеркала с предварительно проверенными подписями.