更新 NGINX 的 PGP 密钥

背景

在 Debian 上习惯性使用 apt update 检查软件包更新时,出现以下错误

1
2
3
W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: http://nginx.org/packages/debian bookworm InRelease: The following signatures were invalid: EXPKEYSIG ABF5BD827BD9BF62 nginx signing key <[email protected]>
W: Failed to fetch http://nginx.org/packages/debian/dists/bookworm/InRelease The following signatures were invalid: EXPKEYSIG ABF5BD827BD9BF62 nginx signing key <[email protected]>
W: Some index files failed to download. They have been ignored, or old ones used instead.

往上看更新详情发现原来是密钥失效了

1
2
Err:1 http://nginx.org/packages/debian bookworm InRelease
The following signatures were invalid: EXPKEYSIG ABF5BD827BD9BF62 nginx signing key <[email protected]>

从搜索引擎上查找了一下,发现官方博客写的很清楚。

如果使用来自 nginx.org 的预构建的 NGINX 开源二进制文件,则需要更新 PGP 密钥。

PGP 密钥是用于签署 NGINX 软件包和软件包存储库元数据的公共加密密钥。

密钥信息

NGINX 在其 RPM 软件包和 Debian/Ubuntu 存储库上使用 PGP 密钥,以便验证下载软件包的完整性和来源。NGINX 的 PGP 密钥将于 2024 年 6 月 14 日过期。

如果使用的是从操作系统包中获取的 NGINX ,则无需更新 PGP 密钥。

PS. 每两年将更换一次 PGP 签名密钥。

更新 PGP 密钥

要更新密钥,只需重新获取并重新导入密钥即可。

Debian/Ubuntu

要在 Debian/Ubuntu 发行版上更新 PGP 密钥,请下载新密钥并覆盖旧密钥。

1
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor | tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null

运行以下命令来验证新密钥的到期日期

1
gpg --dry-run --quiet --no-keyring --import --import-options import-show /usr/share/keyrings/nginx-archive-keyring.gpg

更新 NGINX 源

1
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] http://nginx.org/packages/debian `lsb_release -cs` nginx" > /etc/apt/sources.list.d/nginx.list

类RHEL

如果要在 Amazon Linux、CentOS、Oracle Linux、RHEL 等红帽系上更新密钥,先检查您的 NGINX 存储库是否已配置为检查和验证 PGP 密钥。默认情况下,该检查是禁用的。

如果您的 YUM 存储库文件包含以下行,则检查将被禁用:

1
gpgcheck=0

如果您已经明确配置了 GPG 检查(gpgcheck=1),则需要替换 PGP 密钥。

您可以通过运行命令来检查下载的包的真实性

1
rpm -K

执行以下步骤来更新密钥:

1.检查您是否安装了 NGINX PGP 密钥。

1
rpm -q gpg-pubkey-7bd9bf62-5762b5f8

2.如果安装了 NGINX PGP 密钥,请将其删除。

1
rpm -e gpg-pubkey-7bd9bf62-5762b5f8

3.下载并安装新密钥。

1
2
curl -O https://nginx.org/keys/nginx_signing.key
rpm --import ./nginx_signing.key