Для проверки подлинности пакетов pacman использует ключи GnuPG и сеть доверия. Действующие мастер-ключи Arch Linux можно найти здесь. Ключи разработчиков и сопровождающих пакетов, которыми они подписывают свои пакеты, должны быть подписаны минимум тремя мастер-ключами. У каждого пользователя также есть свой уникальный PGP-ключ, сгенерированный при настройке утилиты pacman-key. Сеть доверия связывает ключи пользователей и мастер-ключи.
Примеры сетей доверия:
- Пользовательские пакеты: обычный пользователь создаёт пакет и подписывает его своим локальным ключом.
- Неофициальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика; обычный пользователь подписывает ключ разработчика локальным ключом.
- Официальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика, подписанным мастер-ключами Arch Linux; обычный пользователь подписывает локальным ключом мастер-ключ и доверяет последнему поручиться за разработчика.
Настройка
Настройка pacman
Опция SigLevel в файле /etc/pacman.conf определяет уровень доверия, необходимый для установки пакета через pacman -S. Подробную информацию о SigLevel можно найти в руководстве pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING и в комментариях в самом файле. Можно настроить проверку подписи как глобально, так для каждого репозитория в отдельности. Если задать SigLevel глобально в разделе [options], то все пакеты, устанавливаемые через pacman -S, должны быть подписаны. При стандартном значении LocalFileSigLevel пакеты, которые вы собрали сами и устанавливаете через pacman -U, подписывать не требуется.
SigLevel задано значение Required, необходимо также указать и DatabaseOptional.Настройка по умолчанию позволяет устанавливать только те скачиваемые пакеты, которые подписаны доверенными ключами:
/etc/pacman.conf
SigLevel = Required DatabaseOptional
Параметр TrustedOnly используется в pacman по умолчанию, то есть настройка ниже аналогична предыдущей:
SigLevel = Required DatabaseOptional TrustedOnly
То же самое можно задать и для отдельного репозитория далее в файле конфигурации:
[core] SigLevel = PackageRequired Include = /etc/pacman.d/mirrorlist
Здесь явно задаётся проверка подписи для пакетов из этого репозитория, но подпись базы данных не проверяется. Если задать здесь значение Optional, то для этого репозитория глобальное значение Required будет отключено.
TrustAll даёт системе указание считать все ключи доверенными. Эта значение используется только для целей отладки. Для официальных репозиториев необходимо использовать значение TrustedOnly.
Инициализация связки ключей
Для инициализации связки ключей pacman выполните:
# pacman-key --init
Управление связкой ключей
Проверка мастер-ключей
Первоначальная настройка ключей выполняется командой:
# pacman-key --populate
При появлении запроса необходимо проверить подлинность мастер-ключей, поскольку они используются для подписи всех пакетов совместно с ключами разработчиков.
PGP-ключи довольно велики (2048 бит или больше), что делает их неудобными для восприятия людьми. Поэтому на основе ключа вычисляется 40-разрядная шестнадцатеричная хэш-сумма, по которой можно проверить его подлинность. Также нужно помнить, что последние восемь цифр хэш-суммы часто используют как имя или (короткий) ID ключа, а последние шестнадцать — как длинный ID ключа.
Добавление ключей разработчика
Ключи официальных разработчиков и сопровождающих пакетов подписываются мастер-ключами, так что вам не нужно использовать pacman-key, чтобы подписывать их самостоятельно. Когда pacman встречает в подписи пакета ключ, который не удаётся распознать, то предлагает скачать его с сервера ключей, указанного в параметре keyserver в файле /etc/pacman.d/gnupg/gpg.conf или в опции --keyserver командной строки. Перечень серверов ключей можно найти в Википедии.
Ключ разработчика нужно скачать всего единожды, после этого он будет использоваться для проверки любого пакета от этого разработчика.
pacman-key --refresh-keys с правами root. При выполнении этой команды pacman-key попытается найти на сервере ключей также и ваш локальный ключ, после чего выдаст сообщение, что ключ не найден — это нормально.
Добавление неофициальных ключей
Этим способом можно добавить в связку ключей pacman свой ключ или включить подписанный неофициальный репозиторий.
В первую очередь получите у владельца ключа его ID (keyid). Добавьте полученный ключ в связку:
- Если ключ находится на сервере ключей, импортируйте его командой:
# pacman-key --recv-keys keyid
- Если у вас есть ссылка на файл ключа, скачайте его и выполните:
# pacman-key --add /путь/к/скачанному/файлу/ключа
Всегда старайтесь проверять отпечаток — как мастер-ключей, так любых других ключей, которые вы собираетесь подписать:
$ pacman-key --finger keyid
Наконец, подпишите импортированный ключ локально:
# pacman-key --lsign-key keyid
Теперь этот ключ будет считаться доверенным.
Отладка при помощи gpg
При отладке доступ к связке ключей pacman можно получить напрямую с помощью gpg, например:
# gpg --homedir /etc/pacman.d/gnupg --list-keys
Советы и рекомендации
Регулярно обновляйте систему
Регулярное обновление системы позволяет избежать большинства ошибок, связанных с подписью. Если вы вынуждены отложить обновление на длительный срок, то перед обновлением системы синхронизируйте базу данных пакетов вручную и обновите пакет archlinux-keyring:
# pacman -Sy archlinux-keyring && pacman -Su
Эта команда не считается частичным обновлением, поскольку сначала синхронизируется база данных пакетов и обновляется пакет с ключами. Обе команды должны быть выполнены непосредственно перед началом обновления системы для работы проверки подписей всех обновляемых пакетов.
archlinux-keyring-wkd-sync.service и связанный с ней systemd-таймер, который запускает получение новых ключей раз в неделю и таким образом решает проблему signature from "Some Developer <developer_email@archlinux.org>" is marginal trust (например, BBS#278332) без вмешательства пользователя.Регулярно синхронизируйте системные часы
Если время в системе будет неправильным, подписи могут считаться просроченными (или недействительными), и проверка подписи пакетов окончится неудачей. Регулярно синхронизируйте системные часы с помощью Network Time Protocol.
Решение проблем
Подпись некорректна
Работа pacman-key зависит от настроек системного времени. Если системные часы неверны, при обновлении вы получите следующую ошибку:
ошибка: НазваниеПакета: подпись от "Пользователь <email@archlinux.org>" некорректна ошибка: не удалось завершить транзакцию (неверный или поврежденный пакет) Обнаружены ошибки, пакеты не обновлены.
Проверьте правильность системного времени. Например, если вы используете ntpd, выполните синхронизацию времени командами ntpd -qg и hwclock -w (запускайте от имени root).
Другие клиенты NTP перечислены в разделе System time (Русский)#Синхронизация времени.
Если системное время правильное, а ошибка всё равно есть, попробуйте следующее:
Удаление пакетов из кэша
Пакеты могли оказаться повреждены или не подписаны. Попробуйте удалить каждый проблемный пакет из кэша командой rm /var/cache/pacman/pkg/плохой_пакет* или сделайте полную очистку кэша, чтобы пакеты скачались заново.
Сброс ключей
Для сброса всех установленных в системе ключей удалите каталог /etc/pacman.d/gnupg. После этого выполните команды pacman-key --init и pacman-key --populate, чтобы добавить базовый набор ключей заново.
Отключение проверки подписи
Если подписи пакетов вас не интересуют, можно полностью отключить их проверку. Отредактируйте файл /etc/pacman.conf, раскомментировав следующую строку в разделе [options]:
SigLevel = Never #LocalFileSigLevel = Optional #RemoteFileSigLevel = Required
Также необходимо закомментировать все параметры SigLevel в настройках репозиториев, потому что они имеют приоритет над глобальными настройками. В результате подпись пакетов проверяться не будет, как это было в pacman до четвёртой версии. В этом случае устанавливать связку ключей при помощи pacman-key не нужно. Позже при необходимости можно будет включить проверку подписи пакетов обратно.
Не удаётся импортировать ключи
Возможные причины:
- Устаревший пакет archlinux-keyring;
- Неправильные настройки даты и времени;
- Интернет-провайдер блокирует порт, используемый для импорта PGP-ключей;
- Кэш pacman содержит неподписанные пакеты, оставшиеся с предыдущих попыток;
- Демон
dirmngrне был правильно настроен.
Давно не обновлявшийся пакет archlinux-keyring может привести к проблемам при синхронизации обновлений.
Ниже приведено несколько возможных решений.
Обновление системы
Прежде всего попробуйте обновить систему.
Смена сервера ключей
Если вы предполагаете, что проблема связана с сервером ключей, то можно попробовать переключиться на сервер ключей Ubuntu. Отредактируйте файл /etc/pacman.d/gnupg/gpg.conf, изменив значение keyserver:
keyserver hkp://keyserver.ubuntu.com
Удаление кэшированных пакетов
Возможно, кэш pacman в каталоге /var/cache/pacman/pkg/ содержит неподписанные пакеты. Очистите кеш вручную:
# pacman -Sc
что удалит все пакеты в кэше, которые не были установлены.
Не удаётся опознать подпись пакета
Иногда при выполнении pacman -Syu вы можете столкнуться со следующей ошибкой:
error: название_пакета: signature from "создатель_пакета" is unknown trust
Такое происходит, когда ключ создателя пакета отсутствует в локальной базе данных pacman-key или не является доверенным. Pacman не всегда имеет возможность проверить, был ли ключ скачан и является ли он доверенным, перед тем как продолжить обновление. Также возможно, что срок действия ключа истёк.
Возможные решения:
- Вручную обновить пакет archlinux-keyring перед обновлением системы;
- обновить ключи командой
pacman-key --refresh-keys; - сбросить ключи;
- вручную подписать недоверенный ключ локально (не рекомендуется);
- временно установить параметр
SigLevelв значениеTrustAll(не рекомендуется).
Последние два варианта ломают цепочку доверия и должны использоваться с осторожностью.
Обновление ключей через прокси
Чтобы можно было обновлять ключи через прокси-сервер, задайте параметр honor-http-proxy в файлах /etc/gnupg/dirmngr.conf и /etc/pacman.d/gnupg/dirmngr.conf. Подробнее смотрите GnuPG (Русский)#Использование сервера ключей.
honor-http-proxy и всё равно завершился с ошибкой, попробуйте перезагрузиться.