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

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

- GnuPG (Русский)
- DeveloperWiki:Package signing

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

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

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

- Пользовательские пакеты: обычный пользователь создаёт пакет и подписывает его своим локальным ключом.
- Неофициальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика; обычный пользователь подписывает ключ разработчика локальным ключом.
- Официальные пакеты: разработчик создаёт пакет и подписывает его ключом разработчика, подписанным мастер-ключами Arch Linux; обычный пользователь подписывает локальным ключом мастер-ключ и доверяет последнему поручиться за разработчика.

Примечание: Протокол HKP использует TCP-порт 11371. Утилите pacman-key нужен этот порт для скачивания подписанных ключей с серверов.

## Настройка

### Настройка pacman

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

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

Для инициализации необходима энтропия. Чтобы сгенерировать больше энтропии, активно двигайте мышью, нажимайте случайные клавиши или выполняейте действия, связанные с диском (например, запустите в другой консоли `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` командной строки. Перечень серверов ключей можно найти в Википедии.

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

Примечание: Пакет 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

## Решение проблем

### error: signature from xxx is invalid

Важно: Работа pacman-key зависит от настроек системного времени. Если системные часы неверны, при обновлении вы получите следующую ошибку:

    error: PackageName: signature from "User <email@archlinux.org>" 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 "<Some.Person@example.com>" is invalid`, произошедшей при обновлении. Такое сообщение не обязательно является свидетельством атаки "человек-посередине" — возможно, пакет просто был повреждён при скачивании.

#### Сброс ключей

Для сброса всех установленных в системе ключей необходимо удалить каталог `/etc/pacman.d/gnupg`. После этого выполните команды `pacman-key --init` и `pacman-key --populate archlinux`, чтобы добавить базовый набор ключей заново.

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

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

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

Примечание: Если 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 (Русский)