Jump to content

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

8 languages

- Deutsch
- English
- Español
- Français
- Italiano
- 日本語
- Português
- 中文（简体）

From ArchWiki
< Pacman (Русский)

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

Ссылки по теме

- GnuPG (Русский)

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

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

- Вручную обновить пакет archlinux-keyring перед обновлением системы;
- обновить ключи командой `pacman-key --refresh-keys`;
- сбросить ключи;
- вручную подписать недоверенный ключ локально (не рекомендуется);
- временно установить параметр `SigLevel` в значение `TrustAll` (не рекомендуется).

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

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

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

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

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

- DeveloperWiki:Package Signing Proposal for Pacman
- Pacman Package Signing – 1: Makepkg and Repo-add
- Pacman Package Signing – 2: Pacman-key
- Pacman Package Signing – 3: Pacman
- Pacman Package Signing – 4: Arch Linux

Category:

- Package manager (Русский)