Что мне делать, когда я получил сообщение об ошибке KEYEXPIRED после обновления apt-get?

74

При обновлении моих пакетов в системе на основе Debian

sudo apt-get update

Я получил это сообщение об ошибке:

Reading package lists... Done
W: GPG error: ftp://ftp.fr.debian.org stable/non-US Release: 
The following signatures were invalid: KEYEXPIRED 1138684904

Что я должен сделать, чтобы это исправить?

paulgreg
источник

Ответы:

117

Чтобы найти ключи хранилища с истекшим сроком действия и их идентификаторы, используйте apt-keyследующее:

LANG=C apt-key list | grep expired

Вы получите результат, подобный следующему:

pub   4096R/BE1DB1F1 2011-03-29 [expired: 2014-03-28]

Идентификатор ключа - это бит после /ie BE1DB1F1в этом случае.

Чтобы обновить ключ, запустите

sudo apt-key adv --recv-keys --keyserver keys.gnupg.net BE1DB1F1

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

Один вкладыш для обновления всех просроченных ключей: (спасибо @ryanpcmcquen)

for K in $(apt-key list | grep expired | cut -d'/' -f2 | cut -d' ' -f1); do sudo apt-key adv --recv-keys --keyserver keys.gnupg.net $K; done
kynan
источник
2
это не работает для меня, после команды для обновления ключа, ключ все еще истек.
Карл Форнер
@KarlForner успешно добавлял ключ?
Кинан
да, это было успешно.
Карл Форнер
4
Один лайнер:for K in $(apt-key list | grep expired | cut -d'/' -f2 | cut -d' ' -f1); do sudo apt-key adv --recv-keys --keyserver keys.gnupg.net $K; done
ryanpcmcquen
2
Просто подсказка для grep part: «expired» - это i18ned, поэтому в зависимости от настроек LANG * это может не сработать, например, для настроек pl_PL.UTF-8 нужно изменить «expired» на «wygasł», чтобы сделать этот лайнер на работу.
Cromax
6

Вам нужно получить новый ключ и добавить его, после чего apt обнаружит его и не будет жаловаться. Это не должно обычно случаться, но иногда случается. Что вам действительно нужно, так это знать шестнадцатеричный код ключа, который нужно добавить; как только вы это сделаете, оттуда это будет довольно сильно.

Некоторые примеры:

Эйвери Пэйн
источник
2

У меня была похожая ошибка, но проблема была в системном времени. Год был 1961 :)

Я исправил системную дату / время и после этого смог обновить без про

Slava
источник
1

На вики Debian о SecureAPT я обнаружил, что должен удалить строку, содержащуюся в non-us/etc/apt/sources.list.

Я действительно сделал это, и это сработало.

paulgreg
источник
5
Возможно, это сработало в одном конкретном случае, но это не общее решение
kynan
1

Это также может произойти, когда дата не верна.

Проверьте дату с

date

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

apt-get install ntp ntpdate && service ntp stop
dpkg-reconfigure tzdata
ntpdate-debian
service ntp start
Алей
источник
1

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

Это может произойти, как и для меня, когда вы размещаете свой собственный репозиторий со своими собственными ключами. Если вы, когда срок действия ключа истекает, просто продлите срок его службы, а не измените его, и если вы установили исходный ключ с помощью preseeding, но обновленный ключ с помощью пакета deb, тогда старый ключ будет в наличии /etc/apt/trusted.gpg, а новый заканчивается как отдельный файл в /etc/apt/trusted.gpg.d/. Старый ключ будет затенять новый, который будет полностью игнорироваться apt-key. Удалите старый ключ, запустив его gpg --keyring /etc/trusted.gpg --delete-keys <keyid>, и ваш новый ключ будет обнаружен.

Это немного нестандартная угловая конфигурация, но я надеюсь, что мой ответ может спасти некоторую путаницу в случае, если кто-то еще столкнется с этой проблемой по той же причине, что и я.

Sampi
источник
1

Более простой oneliner:

for key in $(sudo apt-key list | awk -v FS='[ /:]+' '/expire[sd]/ {print $3}'); do sudo apt-key adv --recv-keys --keyserver keys.gnupg.net $key; done

Я просто чувствую, что если вы делаете такие вещи, как использование cutболее одного раза, есть лучший инструмент. (Кроме того, я создал это на основе другого вопроса .)

Бруно Броноски
источник
-1

Вам не нужно ничего делать. Это просто предупреждение, вы можете видеть это из W:префикса.

Майкл Францль
источник
1
Если бы ему ничего не нужно было делать, вся система подписи для Repos была бы бесполезна. Это функция безопасности, и в производственной среде целостность ключа имеет решающее значение для безопасности.
Broco