#Что означает ошибка
NO_PUBKEY
GPG error: ... NO_PUBKEY XXXXXXXX при apt update означает, что в системе нет публичного ключа репозитория, или ключ устарел. Репозиторий при этом не обновляется, а установка пакетов из него невозможна.
Метод apt-key объявлен устаревшим, сегодня ключи хранят в /etc/apt/keyrings.
Добавьте ключ репозитория в /etc/apt/keyrings и укажите signed-by.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет ключаРепозиторий. | Проявляется как «NO_PUBKEY» или близкий по смыслу сбой. | Добавьте. |
| Устарел ключПодпись. | Проявляется как «NO_PUBKEY» или близкий по смыслу сбой. | Обновите. |
| Сторонний PPAКлюч. | Проявляется как «NO_PUBKEY» или близкий по смыслу сбой. | Импортируйте. |
| ВремяСистемное. | Проявляется как «NO_PUBKEY» или близкий по смыслу сбой. | Исправьте. |
#Пошаговое решение
- Найдите идентификатор ключаВ терминале запустите
sudo apt updateи выпишите весь фрагмент строкиNO_PUBKEY, включая идентификатор и URL репозитория выше неё. Определите, относится ли проблема к официальному архиву Ubuntu или стороннему источнику. Не копируйте ключ с произвольного сервера по одному номеру: злоумышленник может выдать другой ключ с совпадающим кратким идентификатором. Проверяйте полный отпечаток на официальном сайте поставщика. - Скачайте ключ разработчикаВ выводе
sudo apt updateвыпишите URL проблемного стороннего репозитория и его издателя. Перейдите на официальный сайт этого издателя и найдите инструкцию установки его ключа вместе с полным отпечатком. Перед выполнением какой-либо команды загрузки сравните отпечаток. Не вводите буквально примерcurl ... | gpg --dearmorи не используйте ключ из случайной статьи: без конкретного проверенного URL такая команда непригодна. Если источник не нужен, безопаснее отключить только его с резервной копией файла.listили.sources. - Сохраните в /etc/apt/keyringsДля официального стороннего репозитория предпочтительно использовать отдельный файл ключа в
/etc/apt/keyringsлибо/usr/share/keyrings, как предписывает его издатель. Сначала проверьте полный отпечаток ключа из официальной инструкции, затем установите его согласно документации разработчика; формат может быть ASCII.ascили бинарный.gpg. Не копируйте случайный ключ под названиемtrusted.gpg, не используйтеapt-key addи не отключайте проверку подписи. - Укажите signed-byОткройте файл источника проблемного репозитория в
/etc/apt/sources.list.d/или/etc/apt/sources.listчерезsudoeditи сверьте синтаксис с официальной инструкцией издателя. Для записи видаdeb [signed-by=/etc/apt/keyrings/имя-ключа.gpg] https://официальный-адрес выпуск компонентпуть должен указывать на реально скачанный и проверенный ключ; имена и адрес берутся с сайта поставщика, а не из примера. Сохраните файл и повторитеsudo apt update. При сомнении лучше временно отключить сторонний источник. - Обновите индексПосле восстановления ключа только для доверенного источника либо его отключения откройте терминал Ubuntu и выполните
sudo apt update. Дождитесь окончания и убедитесь, что пропала конкретная строкаNO_PUBKEYилиrepository is not signed, а остальные репозитории обновляются. Если ошибка осталась, сравните полный адрес источника и полеSigned-Byс официальной инструкцией; не отключайте проверку подписи APT.
#Современный способ
Скачайте ключ в отдельный файл: sudo mkdir -p /etc/apt/keyrings && curl -fsSL https://example.com/key.gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg. В файле репозитория /etc/apt/sources.list.d/example.list укажите deb [signed-by=/etc/apt/keyrings/example.gpg] URL дистрибутив компонент. Затем sudo apt update.
#Если известен только идентификатор
Получите ключ с сервера: sudo gpg --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXX и экспортируйте: sudo gpg --export XXXXXXXX | sudo tee /etc/apt/trusted.gpg.d/example.gpg >/dev/null. Старый вариант sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys XXXXXXXX работает, но устарел.
#Прочие причины
Ошибка «repository is not signed» или «expired key» — ключ у разработчика обновился, скачайте новый с их сайта. Ошибка «Release file is not valid yet» — неверное время системы: timedatectl. Для устаревших PPA выполните sudo ppa-purge или удалите файл в sources.list.d. Проверьте, что репозиторий поддерживает ваш релиз (lsb_release -cs).
grep -R -h -E "^(deb |URIs:|Signed-By:)" /etc/apt/sources.list /etc/apt/sources.list.d/ 2>/dev/nullsudo apt update