Исправляем ошибку NO_PUBKEY или как добавить ключ репозитория

Иногда после добавления в систему нового репозитория или истечения срока действия ключа уже используемого репозитория вы можете наблюдать сообщение которое например содержит такую фразу: NO_PUBKEY 85C2394343D5CDFA.
Для решения этой проблемы мы написали самую полную инструкцию.

Как добавить этот ключ и устранить эту проблему? – возможно это один из наиболее часто возникающих вопросов у всех кто добавлял репозитории в свою систему кроме системных по умолчанию.
В этой статье я постараюсь изложить все варианты решения которые я встретил в Интернет на разных сайтах.
Поэтому хочу попросить вас дочитать ее до конца, а не останавливаться на первой команде, тем более если она выдала у вас ошибку.

Сразу для понимания самой проблемы, определимся зачем нужны эти самые ключи и почему их требует система.
А нужны они всего лишь для одной цели – защита репозитория от подмены злоумышленником в нем информации по технологии открытых/закрытых ключей. Наша система хранит у себя первую часть ключа (открытый ключ), а сам репозиторий откуда мы берем файлы подписан второй частью ключа (закрытый ключ), который нам не доступен.

Другими словами открытый ключ репозитория который хранится в нашей системе – это своего рода цифровая подпись репозитория. Он гарантирует что все что мы загружаем из репозитория – легально и безопасно. Тем более в последних дистрибутивах, если репозиторий не подписан – он считается не достоверным и с него игнорируются все программы. Но не буду углубляться в эту тему сейчас, она достойна еще одной статьи, что бы рассказать как это работает, поэтому продолжим.

За пример возьмем Debian-подобную систему.
Итак, наша система хранит у себя открытые ключи репозиториев в двух местах:

  1. Файл /etc/apt/trusted.gpg – это один большой файл, в котором может быть информация о нескольких ключах сразу.
  2. Папка /etc/apt/trusted.gpg.d/ – в этой директории может находится много файлов с разными названиями, подобных указанному в прошлом пункте.
    По умолчанию в ней обычно уже находятся такие файлы как:
    ubuntu-keyring-2012-archive.gpg
    ubuntu-keyring-2012-cdimage.gpg
    ubuntu-keyring-2018-archive.gpg

    Сразу хочу обратить внимание на расширение файла в этой директории. Система обрабатывает только два возможных варианта файлов ключей.

    • файл ключа <имя фала>.gpg – содержимое хранится в двоичном(бинарном) виде.
    • файл ключа <имя фала>.asc – содержимое файла должно быть в текстовом виде.
      Причем содержимое файла и его расширение не стоит путать между собой, т.е. если у вас ключа в файле будет в текстовом виде, а вы укажете у файла расширение .gpg, то система его попросту проигнорирует.

Открытые ключи, необходимые системе для того, что бы проверить подлинность репозитория к которому она обращается, обычно могут находиться в двух местах:

  1. На публичных общедоступных серверах хранения публичных ключей. В этом случае рекомендуется брать их из гарантированных источников.
    Например:
    http://keyserver.ubuntu.com/
    https://keyring.debian.org/
    http://keys.gnupg.net/
    https://pgp.mit.edu/
  2. Непосредственно у разработчика репозитория. Обычно сам поставщик репозитория об этом и сообщает у себя на странице и публикует краткую инструкцию как его добавить.
    • Например, вы можете увидеть вот такую строчку:
      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 name_keyserver --recv-keys key_id
где
name_keyserver – берем один из доверенных источников публичных ключей. Например keyserver.ubuntu.com.
key_id – цифровой идентификатор необходимого нам ключа. Если брать пример нашего случая, то это будет 85C2394343D5CDFA. Можно также вначале этого кода добавить 0x, что будет говорить системе что это число в шестнадцатеричной системе исчисления.

Итак, вводим команду:

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 0x85C2394343D5CDFA

Противник повержен и ключ добавлен в систему !


Теперь я хотел бы озвучить разные дополнительные плюшки решения этой проблемы.

  1. Если у вас всего один лишь ключ, то строчку можно еще укоротить на пару символов и вместо ключа --recv-keys использовать просто:--recv
    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 0x85C2394343D5CDFA
  2. Также можно не указывать спецсимвол 0x в цифровом идентификаторе ключа:
    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 85C2394343D5CDFA
  3. Бывают случаи когда на эту команду система не реагирует и начинает долго думать. Спасти ситуацию может следующий синтаксис указания сервера ключей:
    $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 85C2394343D5CDFA
  4. Если у вас выход в интернет доступен только через прокси, тогда необходимо добавить соответствующую опцию:
    --keyserver-options http-proxy="http://your_proxy_server:port"
    где
    your_proxy_server – имя или IP-адрес вашего прокси
    port – его порт
    В результате получим приблизительно вот такой вид команды
    $ sudo apt-key adv --keyserver-options http-proxy="http://192.168.0.1:3128" --keyserver keyserver.ubuntu.com --recv 85C2394343D5CDFA
  5. Если у вас недостает сразу много ключей и вы не хотите добавлять каждый по очереди, вам должна помочь вот такая команда:
    $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys `sudo apt-get update 2>&1 | grep -o '[0-9A-Z]{16}$' | xargs`
    Которая создаст список всех недостающих ключей и сразу общей кучей их добавит. В этой команде также можно добавлять опции указанные в пунктах 3 и 4.
  6. Еще есть вариант “как делали раньше”. Это в том случае, если не помогло все вышесказанное.
    • Вначале получаем публичный ключ и сохраняем его непосредственно в пользовательской базе. Ключи у каждого пользователя хранятся в папке ~/.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

Если у вас есть ключ репозитория в виде файла, его также можно добавить используя графическую утилиту

$ sudo software-properties-gtk


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

Все. Вроде ничего не упустил.

Помогла ли вам эта статья?
Или вы знаете еще что-то, чего не указано в этой статье?

Все замечания и неточности прошу указывать в комментариях.
Буду сразу стараться оперативно исправлять ошибки или дополнять статью.

0 0 vote
Article Rating

Publication author

offline 2 hours

Админ

Стараюсь для вас
Comments: 948Publics: 831Registration: 10-06-2016
Если Вам понравилась статья, то поделитесь ею в соц.сетях:
 
guest
0 Комментарий
Inline Feedbacks
View all comments