apt-get更新后收到KEYEXPIRED错误消息时该怎么办?


73

当由a在基于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

我应该怎么做才能解决这个问题?

Answers:


117

要查找任何过期的存储库密钥及其标识,请使用apt-key以下方法:

LANG=C apt-key list | grep expired

您将得到类似于以下结果:

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

在这种情况下,密钥ID是/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

2
这对我不起作用,在更新密钥的命令之后,密钥仍然过期。
Karl Forner 2014年

@KarlForner添加密钥成功了吗?
kynan 2014年

是的,它成功了。
Karl Forner 2014年

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部分的提示:“ expired”是i18ned,因此根据LANG *设置,此设置可能无法正常工作,例如对于设置pl_PL.UTF-8,必须将“ expired”更改为“wygasł”,以使其成为一个-班轮工作。
Cromax

6

您需要获取新密钥并添加它,这时apt将检测到它并且不会抱怨。这通常不应该发生,但有时会发生。您真正需要的是知道您需要添加的密钥的十六进制代码。一旦有了它,它便从那里下坡了。

一些例子:


2

我有类似的错误,但是问题出在系统时间上。那年是1961年:)

我更正了系统日期/时间,此后无需专业人士即可进行更新



1

日期不正确时也可能发生。

用检查日期

date

如果配置错误,请执行以下操作来设置您的时区和日期自动同步。

apt-get install ntp ntpdate && service ntp stop
dpkg-reconfigure tzdata
ntpdate-debian
service ntp start

1

导致此错误的可能性极小(但有时也可能是)的原因是,两次添加相同密钥的有效期不同。您可能会知道这样做是为了使该答案与您相关。

当使用自己的密钥托管自己的存储库时,可能会发生这种情况,就像对我一样。如果您要在密钥即将失效时延长其寿命而不是更改密钥,并且如果您使用预置种子安装了原始密钥,而使用deb软件包安装了更新的密钥,则旧密钥将位于中/etc/apt/trusted.gpg,而新密钥将位于中最终作为一个单独的文件位于下/etc/apt/trusted.gpg.d/。旧密钥将遮盖新密钥,而新密钥将被完全忽略apt-key。通过运行删除旧密钥gpg --keyring /etc/trusted.gpg --delete-keys <keyid>,新密钥将被检测到。

这有点非标准的转角配置,但是我希望我的回答可以避免造成一些混乱,以防其他人由于与我相同的原因而遇到此问题。


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的Signing系统将毫无用处。这是一项安全功能,在生产环境中,密钥完整性对于安全性至关重要。
布罗科
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.