如何绕过/忽略apt的gpg签名检查?

我访问的所有密钥服务器都超时了。我需要在不检查公钥签名的情况下安装软件包。有没有办法绕过所有的签名检查/忽略所有的签名错误,或者欺骗apt以为签名已通过?
我非常清楚这样做是危险的。

1通常情况下,您在添加存储库的同时会将密钥安装到本地,那么为什么还需要访问密钥服务器呢? - JanC
6个回答

--allow-unauthenticated选项传递给apt-get,如下所示:
sudo apt-get --allow-unauthenticated upgrade

apt-get的手册页面中:

--allow-unauthenticated
忽略无法验证的软件包并且不会提示。这对于像pbuilder这样的工具非常有用。配置项: APT::Get::AllowUnauthenticated。

您可以通过在/etc/apt/apt.conf.d/目录下使用自己的配置文件来使此设置永久生效。文件名可以是99myown,并且可以包含以下内容:

APT::Get::AllowUnauthenticated "true";

这样一来,你就不需要每次想要安装软件时都使用这个选项了。注意:我不建议默认设置此选项,因为它会绕过签名检查,可能导致对手入侵你的计算机。

15提示信息:此操作可使用 apt-get 命令,但不能使用普通的 apt 命令。 - Tor Klingberg
14Ubuntu 16.0 LTS。这个不起作用/对任何事情都没有影响。 - wvxvw
1在Debian 10上也无法工作,请参考下面的答案,其中包含Acquire::相关信息。 - anymous.asker

如果您想从一个将密钥打包并包含在存储库中的存储库获取软件包,而且没有其他地方提供这些密钥,那么使用dpkg下载和安装密钥/密钥环软件包可能会非常烦人,并且很难以一种易于脚本化和可重复的方式进行操作。
如果您可以通过密钥服务器安装密钥或通过https从可信源下载它们,下面的脚本不建议使用,但如果您没有任何其他方法,可以使用它。
echo "deb http://your.repo.domain/repository/ $(lsb_release -c -s) universe" | sudo tee /etc/apt/sources.list.d/your-repo-name.list

sudo apt -o Acquire::AllowInsecureRepositories=true \
-o Acquire::AllowDowngradeToInsecureRepositories=true \
update

## if the 'apt update' above fails it is likely due to previously
## having the GPG key and repository on the system, you can clean
## out the old lists with `sudo rm /var/lib/apt/lists/your.repo.domain*`

apt-get -o APT::Get::AllowUnauthenticated=true install repo-keyring-pkgname

## If you ever run `sudo apt-key del your-repos-keyID`
## you may have to `sudo apt remove --purge repo-keyring-pkgname`
## Update should run without the GPG warnings now that the key is installed

apt-get update
apt-get install somepkg-from-repo

我最初之所以这样做是因为i3在他们的sur5r存储库中也这样做,但后来我发现他们的密钥在keyserver.ubuntu.com列表中,所以我只需执行sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E3CA1A89941C42E6就可以避免所有额外的软件包麻烦。

因为i3问题而来到这里 - sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys E3CA1A89941C42E6解决了!非常感谢! - Benedikt Köppel
这是唯一适用于不签署其密钥的存储库的答案。 - anymous.asker

我在一个旧的Debian服务器上遇到了同样的问题。我甚至无法执行apt-get update命令,它给出了以下错误:
E: Release file expired, ignoring http://archive.debian.org/debian/dists/squeeze-lts/Release (invalid since 1183d 0h 2min 51s)
最后的解决办法是添加以下内容到/etc/apt/apt.conf文件中(如果不存在则创建):
Acquire::Check-Valid-Until false;
添加完毕后,错误变成了一个简单的警告。
我猜这个方法在Ubuntu上也可能适用。
请注意,这是完全不安全的。

如果真的那么不安全,我建议你干脆不要发布它。 - ThunderBird
10这样做的安全方式是升级发行版。在一些复杂的客户案例中,你无法升级。由于整个问题都以这个免责声明开始:“我非常清楚这样做很危险”,我认为我的贡献是合适的。如果不合适,我可以将其删除。 - Gnusam
4这是一个完全合适的解决方案。 - Ken Sharp
1强制过期的密钥继续工作没有问题。过期并不意味着密钥已被泄露,只是某人忘记更新它们而已。但你仍然可以进行签名检查。 - Mitar
这对我没有起作用。我在apt-get update仍然收到EXPKEYSIG的错误提示。 - Mitar
1这比禁用密钥检查要安全一些。仓库在午夜不会变成南瓜。密钥过期、密钥被吊销和密钥不在密钥环中的安全姿态之间存在巨大差异。浏览器行为教导了错误的信任策略,因为浏览器的信任策略非常有问题。 - Wil

也许你可以尝试创建文件/etc/apt/apt.conf(如果你创建了它,系统会读取它),并插入以下代码:
APT{Ignore {"gpg-pubkey"; }};

6对我来说不起作用。但是当我添加了APT { Get { AllowUnauthenticated "1"; }; };时就可以工作了。 - php-coder
1Ubuntu 16.0 LTS:对apt-get的操作没有任何影响。 - wvxvw

在不断尝试的过程中,终于找到了解决办法。 从未签名的存储库强制更新 在较新版本的Ubuntu中,可以使用--allow-insecure-repositories代替--allow-unauthenticated。
要执行更新操作,命令如下:
sudo apt-get update --allow-insecure-repositories

创建 /etc/apt/apt.conf.d/99allow_unauth 文件,并将以下内容添加进去:
APT { Get { AllowUnauthenticated "1"; }; };

感谢 php-coder评论
在您的 sources.list 文件中使用这种语法也可能有所帮助:
deb [ allow-insecure=yes ] http...

1在Ubuntu 22.04上无法运行。 - Dario Costa