Виправляємо помилку 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 <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

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


Тепер я хотів би озвучити різні додаткові плюшки розв’язання цієї проблеми.

  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 <strong>hkp://keyserver.ubuntu.com:80</strong> --recv 85C2394343D5CDFA
  4. Якщо у вас вихід в інтернет доступний тільки через проксі, тоді необхідно додати відповідну опцію:
    --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
  5. Якщо у вас бракує відразу багато ключів і ви не хочете додавати кожен по черзі, вам повинна допомогти ось така команда:
    $ 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.
  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


Як ви здогадалися, через кнопку “Імпортувати файл ключа”.
Але як на мене це більше погратися ніж зручність, особливо з огляду на те, що більшість ключів у файлах не буває.
У цій же утиліті можна переглянути ті ключі, які вже встановлені в системі або видалити.

Усе. Начебто нічого не упустив.

Чи допомогла вам ця стаття?
Або ви знаєте ще щось, чого не вказано в цій статті?

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

Поділіться своєю любов'ю

Залишити відповідь

1 Комментарий
Новіші
Старіші Найпопулярніші
Вбудовані Відгуки
Переглянути всі коментарі
Horio

Спасибо, помогло для Dеbian -> booster. Достаточно было ввести команду
apt-key adv --keyserver <strong>name_keyserver</strong> --recv-keys <strong>key_id</strong>
<strong>три раза для трёх ключей(два оказались не нужными - они не для бустера).</strong>
<strong>Всё остальное - не пригодилось. Огромное спасибо!!!</strong>

1
0
Ми любимо ваші думки, будь ласка, прокоментуйте.x