pacman (Русский)/Package signing (Русский)
Для проверки подлинности пакетов 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
и всё равно завершился с ошибкой, попробуйте перезагрузиться.