25
октябрь
2023
Как избавиться от предупреждения при обновлении apt-get update "W: key is stored in legacy trusted.gpg keyring"?
16:15

Как избавиться от предупреждения при обновлении apt-get update "W: key is stored in legacy trusted.gpg keyring"?

25 октябрь 2023 16:15

Если к операционной системе Linux подключены сторонние репозитории, при обновлении пакетов может выдаваться сообщение об ошибке "Key is stored in legacy trusted.gpg keyring".

Причина данного предупреждения

В нескольких последних версиях Ubuntu и Linux Mint происходит отказ от использования программы apt-key, которая добавляла ключ репозитория в единое хранилище. Которое устарело (legacy), хотя и не потеряло совместимость, но использовать его не рекомендуется. Вместо "старого" хранилища ключей /etc/apt/trusted.gpg, следует использовать новые хранилища ключей GPG для каждого из репозиториев, в папке: /etc/apt/trusted.gpg.d.

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

  1. Название репозитория нам известно (написано в сообщении об ошибке при apt-get update). В данной случае это dl.winehq.org
  2. С помощью команды sudo apt-key list узнаем шестнадцатиричный код подписи репозитория

    sudo apt-key list

искать приходится глазами по имени. Видны такие строчки:
----------------------------------
pub rsa3072 2018-12-10 [SC]
D43F 6401 4536 9C51 D786 DDEA 76F1 A20F F987 672F
uid [ неизвестно ] WineHQ packages wine-devel@winehq.org

  1. Узнаю код подписи - последние 8 символов полного кода ключа GPG.

Из кода D43F 6401 4536 9C51 D786 DDEA 76F1 A20F F987 672F беру последние 8 символов и удаляю пробел.
Получилось F987672F.

  1. Выполняю импорт в файл GPG нового хранилища при помощи однострочной команды:

    sudo apt-key export F987672F | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/wine-hq.gpg

где apt-key использую лишь для экспорта ключа с отпечатком F987672F

В случае других программ, команду из примера нужно исправить соответственно. Потребуется лишь заменить код ключа для экспорта и имя файла назначения.

Например, для браузера Яндекс подпись будет хранится в папке /etc/apt/trusted.gpg.d/ в файле yandex-browser.gpg :

sudo apt-key export 083A7A9A | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/yandex-browser.gpg

Как избежать повторного возникновения ошибки при добавлении сторонних репозиториев

Нужно избегать любого использования команды sudo apt-key, таких как:

  • sudo apt-key import файл_ключа.key или
  • wget -qO- <URL> | sudo apt-key add -
  • curl -sS <URL>.gpg | sudo apt-key add -
  • sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 00000000

Ключ adv устарел, о чём говорится в man.
Команда sudo apt-key add устарела.

Корректный (новый) способ добавления ключа репозитория на примере репозитоерия WineHQ:

Если ключ лежит на сервере:

wget  -qO- https://dl.winehq.org/wine-builds/winehq.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/winehq.gpg  > /dev/null

Если публичный ключ находится в базе данных криптографических ключей на сервере keyserver.ubuntu.com :

Первая команда импортирует ключ в локальную БД:

gpg --keyserver keyserver.ubuntu.com --recv E084DAB9 

Вторая команда экспортирует ключ и добавляет его в частное хранилище some.gpg:

gpg --export E084DAB9  | sudo tee /etc/apt/trusted.gpg.d/some.gpg  > /dev/null

где E084DAB9 - отпечаток публичного ключа, some.gpg - имя файла хранилища ключей GPG, придуманное пользователем.

Проверьте, что gpg сформировал корректный файл:

file /etc/apt/trusted.gpg.d/some.gpg

Вывод должен показать, что перед нами файл формата бинарного сертификата OpenPGP:

/etc/apt/trusted.gpg.d/some.gpg: OpenPGP Public Key Version 4, Created Mon Dec 10 16:56:24 2018, RSA (Encrypt or Sign, 3072 bits); User ID; Signature; OpenPGP Certificate



После импорта ключа, можно выполнять, как обычно, команду apt-add-repository и установку программы, например:
sudo apt-add-repository 'https://dl.winehq.org/wine-builds/ubuntu/ main'
sudo apt update
sudo apt install wine

Корректный способ решения проблемы №2 (взят из инструкции по установке OpenVPN)

Загрузка ключа repo-public.gpg с сайта и добавление в связку ключей /usr/share/keyrings/openvpn-public.gpg

curl -fsSL https://swupdate.openvpn.net/repos/repo-public.gpg | sudo gpg --dearmor -o /usr/share/keyrings/openvpn-public.gpg    

В этом способе вместо wget используется curl, вместо tee используется параметр -o, вместо папки /etc/apt/trusted.gpg.d/ используется /usr/share/keyrings/.

В файле опиcания источника данных для репозитория стороннего ПО Ubuntu Linux 22 "Jammy" указываем импортированный ключ GPG, которым подписан репозиторий

sudo echo "deb [arch=amd64 signed-by=/usr/share/keyrings/openvpn-public.gpg] https://build.openvpn.net/debian/openvpn/stable jammy main" > /etc/apt/sources.list.d/openvpn-repo.list

Здесь в файле в sources.list.d добавлено упоминание ключа [arch=amd64 signed-by=/usr/share/keyrings/openvpn-public.gpg] из связки ключей gpg.

В какой папке лучше хранить ключи gpg?

(Дополнение от 24.11.2023)

Где правильно хранить ключи - в папке /etc/apt/trusted.gpg.d/ или в /usr/share/keyrings ?

Инструкция man sources.list так отвечает на данный вопрос:

"Рекомендуемые места для хранения ключей: /usr/share/keyrings для связок ключей, управляющих пакетами, и /etc/apt/keyrings для связок ключей, управляемых системным оператором. Если файлы связки ключей не указаны, по умолчанию используется связка ключей trusted.gpg и все наборы ключей в каталоге trusted.gpg.d/ (...)"

Таким образом, нет прямого указания, как правильно хранить ключи gpg. Логично ключи для репозиториев apt размещать в папке /etc/apt/trusted.gpg.d/, тогда как наборы ключей для других целей можно помещать в /usr/share/keyrings. Если стоит цель - сохранить ключи при переустановке системы, то следует использовать папку ~/.local/share/keyrings, в которой можно хранить личные ключи пользователя.


Источники:



Похожие публикации