Иногда после добавления в систему нового репозитория или истечения срока действия ключа уже используемого репозитория вы можете наблюдать сообщение которое например содержит такую фразу: NO_PUBKEY 85C2394343D5CDFA.
Для решения этой проблемы мы написали самую полную инструкцию.
Как добавить этот ключ и устранить эту проблему? — возможно это один из наиболее часто возникающих вопросов у всех кто добавлял репозитории в свою систему кроме системных по умолчанию.
В этой статье я постараюсь изложить все варианты решения которые я встретил в Интернет на разных сайтах.
Поэтому хочу попросить вас дочитать ее до конца, а не останавливаться на первой команде, тем более если она выдала у вас ошибку.
Сразу для понимания самой проблемы, определимся зачем нужны эти самые ключи и почему их требует система.
А нужны они всего лишь для одной цели — защита репозитория от подмены злоумышленником в нем информации по технологии открытых/закрытых ключей. Наша система хранит у себя первую часть ключа (открытый ключ), а сам репозиторий откуда мы берем файлы подписан второй частью ключа (закрытый ключ), который нам не доступен.
Другими словами открытый ключ репозитория который хранится в нашей системе — это своего рода цифровая подпись репозитория. Он гарантирует что все что мы загружаем из репозитория — легально и безопасно. Тем более в последних дистрибутивах, если репозиторий не подписан — он считается не достоверным и с него игнорируются все программы. Но не буду углубляться в эту тему сейчас, она достойна еще одной статьи, что бы рассказать как это работает, поэтому продолжим.
За пример возьмем Debian-подобную систему.
Итак, наша система хранит у себя открытые ключи репозиториев в двух местах:
- Файл
/etc/apt/trusted.gpg
— это один большой файл, в котором может быть информация о нескольких ключах сразу. - Папка
/etc/apt/trusted.gpg.d/
— в этой директории может находится много файлов с разными названиями, подобных указанному в прошлом пункте.
По умолчанию в ней обычно уже находятся такие файлы как:
ubuntu-keyring-2012-archive.gpg
ubuntu-keyring-2012-cdimage.gpg
ubuntu-keyring-2018-archive.gpg
Сразу хочу обратить внимание на расширение файла в этой директории. Система обрабатывает только два возможных варианта файлов ключей.- файл ключа <имя фала>.gpg — содержимое хранится в двоичном(бинарном) виде.
- файл ключа <имя фала>.asc — содержимое файла должно быть в текстовом виде.
Причем содержимое файла и его расширение не стоит путать между собой, т.е. если у вас ключа в файле будет в текстовом виде, а вы укажете у файла расширение .gpg, то система его попросту проигнорирует.
Открытые ключи, необходимые системе для того, что бы проверить подлинность репозитория к которому она обращается, обычно могут находиться в двух местах:
- На публичных общедоступных серверах хранения публичных ключей. В этом случае рекомендуется брать их из гарантированных источников.
Например:
http://keyserver.ubuntu.com/
https://keyring.debian.org/
http://keys.gnupg.net/
https://pgp.mit.edu/ - Непосредственно у разработчика репозитория. Обычно сам поставщик репозитория об этом и сообщает у себя на странице и публикует краткую инструкцию как его добавить.
- Например, вы можете увидеть вот такую строчку:
wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | sudo apt-key add -
которая добавляет ключ репозитория непосредственно в файл/etc/apt/trusted.gpg
- или вот такого плана:
sudo curl -o /etc/apt/trusted.gpg.d/agp-debian-key.gpg http://download.ag-projects.com/agp-debian-key.gpg
которая кладет файл репозитория в директорию/etc/apt/trusted.gpg.d/
- Например, вы можете увидеть вот такую строчку:
Мы рассмотрим добавление ключа из серверов хранения открытых ключей. Так как 90% ключей может быть обнаружено на них, а остальные 10% нужно смотреть как их добавить непосредственно на сайте разработчика репозитория.
Для этого запускаем терминал и вводим всего одну лишь команду:
$ sudo apt-key adv --keyserver <strong>name_keyserver</strong> --recv-keys <strong>key_id</strong>
где
name_keyserver — берем один из доверенных источников публичных ключей. Например keyserver.ubuntu.com.
key_id — цифровой идентификатор необходимого нам ключа. Если брать пример нашего случая, то это будет 85C2394343D5CDFA. Можно также вначале этого кода добавить 0x, что будет говорить системе что это число в шестнадцатеричной системе исчисления.
Итак, вводим команду:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0x85C2394343D5CDFA
Противник повержен и ключ добавлен в систему !
Теперь я хотел бы озвучить разные дополнительные плюшки решения этой проблемы.
- Если у вас всего один лишь ключ, то строчку можно еще укоротить на пару символов и вместо ключа
--recv-keys
использовать просто:--recv
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 0x85C2394343D5CDFA
- Также можно не указывать спецсимвол 0x в цифровом идентификаторе ключа:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 85C2394343D5CDFA
- Бывают случаи когда на эту команду система не реагирует и начинает долго думать. Спасти ситуацию может следующий синтаксис указания сервера ключей:
$ sudo apt-key adv --keyserver <strong>hkp://keyserver.ubuntu.com:80</strong> --recv 85C2394343D5CDFA
- Если у вас выход в интернет доступен только через прокси, тогда необходимо добавить соответствующую опцию:
--keyserver-options http-proxy="http://your_proxy_server:port"
где
your_proxy_server — имя или IP-адрес вашего прокси
port — его порт
В результате получим приблизительно вот такой вид команды
$ sudo apt-key adv <strong>--keyserver-options http-proxy="http://192.168.0.1:3128"</strong> --keyserver keyserver.ubuntu.com --recv 85C2394343D5CDFA
- Если у вас недостает сразу много ключей и вы не хотите добавлять каждый по очереди, вам должна помочь вот такая команда:
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys <strong>`sudo apt-get update 2>&1 | grep -o '[0-9A-Z]{16}$' | xargs`</strong>
Которая создаст список всех недостающих ключей и сразу общей кучей их добавит. В этой команде также можно добавлять опции указанные в пунктах 3 и 4. - Еще есть вариант «как делали раньше». Это в том случае, если не помогло все вышесказанное.
- Вначале получаем публичный ключ и сохраняем его непосредственно в пользовательской базе. Ключи у каждого пользователя хранятся в папке ~/.gnupg, которая расположена в его домашней папке.
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 0x85C2394343D5CDFA
Эту команду также можно писать в интерпретациях как мы описывали выше. - А теперь делаем экспорт этого ключа уже из нашей пользовательской базы и добавляем его в базу системных ключей APT
$ gpg --export --armor 85C2394343D5CDFA | sudo apt-key add --
или так
$ gpg -a --output /tmp/pub.asc --export 85C2394343D5CDFA
$ sudo apt-key add /tmp/pub.asc - Или еще проще. Просто проведите экспорт ключа сразу в папку
/etc/apt/trusted.gpg.d/
$ sudo gpg -a --output /etc/apt/trusted.gpg.d/required_key.asc --export 85C2394343D5CDFA
- Вначале получаем публичный ключ и сохраняем его непосредственно в пользовательской базе. Ключи у каждого пользователя хранятся в папке ~/.gnupg, которая расположена в его домашней папке.
Если у вас есть ключ репозитория в виде файла, его также можно добавить используя графическую утилиту
$ sudo software-properties-gtk
Как вы догадались, через кнопку «Импортировать файл ключа».
Но как по мне это больше баловство чем удобство, особенно учитывая то, что большинство ключей в файлах не бывает.
В этой же утилите можно просмотреть те ключи, которые уже установленны в системе или удалить.
Все. Вроде ничего не упустил.
Помогла ли вам эта статья?
Или вы знаете еще что-то, чего не указано в этой статье?
Все замечания и неточности прошу указывать в комментариях.
Буду сразу стараться оперативно исправлять ошибки или дополнять статью.
Спасибо, помогло для Dеbian -> booster. Достаточно было ввести команду
apt-key adv --keyserver <strong>name_keyserver</strong> --recv-keys <strong>key_id</strong>
<strong>три раза для трёх ключей(два оказались не нужными - они не для бустера).</strong>
<strong>Всё остальное - не пригодилось. Огромное спасибо!!!</strong>