pacman (Русский)/Package signing (Русский)
Для определения подлинности пакетов pacman использует ключи GnuPG и сеть доверия. Действующие мастер-ключи Arch Linux можно найти здесь. Ключи разработчиков и доверенных пользователей, которыми они подписывают свои пакеты, должны быть подписаны минимум тремя мастер-ключами. У каждого пользователя также есть свой уникальный PGP-ключ, сгенерированный при настройке утилиты pacman-key. Сеть доверия связывает ключи пользователей и мастер-ключи.
Примеры сетей доверия:
- Пользовательские пакеты: обычный пользователь создаёт пакет и подписывает его своим локальным ключом.
- Неофициальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика; обычный пользователь подписывает ключ разработчика локальным ключом.
- Официальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика, подписанным мастер-ключами Arch Linux; обычный пользователь подписывает локальным ключом мастер-ключ и доверяет последнему поручиться за разработчика.
Настройка
Настройка pacman
Опция SigLevel
в файле /etc/pacman.conf
определяет необходимый для установки пакета уровень доверия. Подробную информацию о SigLevel
можно найти в руководстве pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING и в комментариях в самом файле. Можно настроить проверку подписи как глобально, так для каждого репозитория в отдельности. Если задать SigLevel
глобально в разделе [options]
, то абсолютно все пакеты должны быть подписаны. Пакеты, которые вы собрали сами, необходимо подписывать с помощью утилиты makepkg.
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
Для инициализации необходима энтропия. Чтобы сгенерировать больше энтропии, активно двигайте мышью, нажимайте случайные клавиши или выполняейте действия, связанные с диском (например, запустите в другой консоли ls -R /
, find / -name foo
или dd if=/dev/sda8 of=/dev/tty7
). Если энтропия системы недостаточна, этот этап может занять часы; активная генерация энтропии ускорит процесс.
Генерируемая последовательность случайных чисел используется для создания связки ключей (/etc/pacman.d/gnupg
) и GPG-ключа вашей системы.
pacman-key --init
на компьютере, который не генерирует много энтропии (например, на удалённом сервере), создание ключа может занять очень много времени. Для выработки псевдоэнтропии установите утилиты haveged или rng-tools и запустите соответствующую службу перед командой pacman-key --init
.
Управление связкой ключей
Проверка мастер-ключей
Первоначальная настройка ключей выполняется командой:
# pacman-key --populate archlinux
При появлении запроса необходимо проверить подлинность мастер-ключей, поскольку они используются для подписи всех пакетов совместно с ключами разработчиков.
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
Решение проблем
error: signature from xxx is invalid
error: PackageName: signature from "User <[email protected]>" is invalid error: failed to commit transaction (invalid or corrupted package (PGP signature)) Errors occured, no packages were upgraded.
Эта ошибка связана с gpg. Она означает, что пакет на диске не сооветствует пакету, который был подписан его сопроводителем. Выяснить причину может быть непросто, но в большинстве случаев удаление файла и скачивание его заново решает проблему. И в любом случае, такое сообщение об ошибке свидетельствует о проблеме с gpg и ключами, которые используются для подписывания пакетов.
Ниже приведены три возможных решения. Если вы не уверены, что выбрать, попросите о помощи на форуме.
Удаление старых версий пакетов
Если постоянно возникает проблема с одним и тем же пакетом и вы уверены, что дело не в pacman-key, попробуйте удалить плохой пакет из кэша командой rm /var/cache/pacman/pkg/плохой_пакет*
и скачайте его заново.
Удаление пакета из кэша может помочь при ошибке error: linux: signature from "<[email protected]>" is invalid
, произошедшей при обновлении. Такое сообщение не обязательно является свидетельством атаки "человек-посередине" — возможно, пакет просто был повреждён при скачивании.
Сброс ключей
Для сброса всех установленных в системе ключей необходимо удалить каталог /etc/pacman.d/gnupg
. После этого выполните команды pacman-key --init
и pacman-key --populate archlinux
, чтобы добавить базовый набор ключей заново.
Отключение проверки подписи
Если подписи пакетов вас не интересуют, можно полностью отключить их проверку. Отредактируйте файл /etc/pacman.conf
, раскомментировав следующую строку в разделе [options]
:
SigLevel = Never
Также необходимо закомментировать все параметры SigLevel в настройках репозиториев, потому что они имеют приоритет над глобальными настройками. В результате подпись пакетов проверяться не будет, как это было в pacman до четвертой версии. В этом случае устанавливать связку ключей при помощи pacman-key не нужно. Позже при необходимости можно будет включить проверку подписи пакетов обратно.
Не удаётся импортировать ключи
Возможные причины:
- Устаревший пакет archlinux-keyring;
- Неправильные настройки даты и времени;
- Интернет-провайдер блокирует порт, используемый для импорта PGP-ключей;
- Кэш pacman содержит неподписанные пакеты, оставшиеся с предыдущих попыток;
- Демон
dirmngr
не был правильно настроен; - Вы давно не обновлялись и gpg/pacman не справились с обновлением.
Давно не обновлявшийся пакет 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 не всегда имеет возможность проверить, был ли ключ скачан и является ли он доверенным, перед тем как продолжить обновление. Также возможно, что срок действия ключа истёк.
Возможные решения:
- обновить ключи командой
pacman-key --refresh-keys
; - вручную подписать недоверенный ключ локально;
- сбросить ключи;
- временно установить параметр
SigLevel
в значениеTrustAll
(не рекомендуется).
Обновление ключей через прокси
Чтобы можно было обновлять ключи через прокси-сервер, задайте параметр honor-http-proxy
в файлах /etc/gnupg/dirmngr.conf
и /etc/pacman.d/gnupg/dirmngr.conf
. Подробнее смотрите GnuPG#Use a keyserver.
honor-http-proxy
и все равно завершился с ошибкой, попробуйте перезагрузиться.