pacman (Русский)/Package signing (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи pacman/Package signing. Дата последней синхронизации: 30 октября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Для проверки подлинности пакетов pacman использует ключи GnuPG и сеть доверия. Действующие мастер-ключи Arch Linux можно найти здесь. Ключи разработчиков и сопровождающих пакетов, которыми они подписывают свои пакеты, должны быть подписаны минимум тремя мастер-ключами. У каждого пользователя также есть свой уникальный PGP-ключ, сгенерированный при настройке утилиты pacman-key. Сеть доверия связывает ключи пользователей и мастер-ключи.

Примеры сетей доверия:

  • Пользовательские пакеты: обычный пользователь создаёт пакет и подписывает его своим локальным ключом.
  • Неофициальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика; обычный пользователь подписывает ключ разработчика локальным ключом.
  • Официальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика, подписанным мастер-ключами Arch Linux; обычный пользователь подписывает локальным ключом мастер-ключ и доверяет последнему поручиться за разработчика.
Примечание: Протокол HKP использует TCP-порт 11371. Утилите pacman-key нужен этот порт для скачивания подписанных ключей с серверов.

Настройка

Настройка pacman

Опция SigLevel в файле /etc/pacman.conf определяет уровень доверия, необходимый для установки пакета через pacman -S. Подробную информацию о SigLevel можно найти в руководстве pacman.conf(5) § PACKAGE AND DATABASE SIGNATURE CHECKING и в комментариях в самом файле. Можно настроить проверку подписи как глобально, так для каждого репозитория в отдельности. Если задать SigLevel глобально в разделе [options], то все пакеты, устанавливаемые через pacman -S, должны быть подписаны. При стандартном значении LocalFileSigLevel пакеты, которые вы собрали сами и устанавливаете через pacman -U, подписывать не требуется.

Примечание: В настоящее время все официальные пакеты подписаны, но подписывание баз данных на ноябрь 2018 не завершено. Если в параметре 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 будет отключено.

Важно: SigLevel 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 командной строки. Перечень серверов ключей можно найти в Википедии.

Ключ разработчика нужно скачать всего единожды, после этого он будет использоваться для проверки любого пакета от этого разработчика.

Примечание: Пакет archlinux-keyring, являющийся зависимостью для pacman, содержит самые свежие на момент последнего обновления ключи. При необходимости ключи можно также обновить вручную командой pacman-key --refresh-keys с правами root. При выполнении этой команды pacman-key попытается найти на сервере ключей также и ваш локальный ключ, после чего выдаст сообщение, что ключ не найден — это нормально.

Добавление неофициальных ключей

Этим способом можно добавить в связку ключей pacman свой ключ или включить подписанный неофициальный репозиторий.

В первую очередь получите у владельца ключа его ID (keyid). Добавьте полученный ключ в связку:

  1. Если ключ находится на сервере ключей, импортируйте его командой:
    # pacman-key --recv-keys keyid
  2. Если у вас есть ссылка на файл ключа, скачайте его и выполните:
    # 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

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

Примечание: С 2022 года созданы и включены по умолчанию служба 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, чтобы добавить базовый набор ключей заново.

Отключение проверки подписи

Важно: Используйте с осторожностью. Отключение проверки подписи приведёт к тому, что pacman будет без возражений устанавливать любые пакеты, в том числе и недоверенные.

Если подписи пакетов вас не интересуют, можно полностью отключить их проверку. Отредактируйте файл /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 не всегда имеет возможность проверить, был ли ключ скачан и является ли он доверенным, перед тем как продолжить обновление. Также возможно, что срок действия ключа истёк.

Возможные решения:

Последние два варианта ломают цепочку доверия и должны использоваться с осторожностью.

Обновление ключей через прокси

Чтобы можно было обновлять ключи через прокси-сервер, задайте параметр honor-http-proxy в файлах /etc/gnupg/dirmngr.conf и /etc/pacman.d/gnupg/dirmngr.conf. Подробнее смотрите GnuPG (Русский)#Использование сервера ключей.

Примечание: Если pacman-key был запущен без опции honor-http-proxy и всё равно завершился с ошибкой, попробуйте перезагрузиться.

Смотрите также