Linux软件包源配置文件虽不参与GPG签名校验,却是验证链起点,决定元数据下载地址和验签公钥;Debian/Ubuntu用sources.list(deb URI dist comp),RHEL/CentOS/Fedora用/etc/yum.repos.d/*.repo(含gpgcheck=1、gpgkey=等关键字段),且需满足gpgkey存在可读、签名文件同步到位、系统时间准确三前提,方可生效。

Linux 软件包源配置文件本身不参与 GPG 签名校验,但它是整个签名验证链的起点——它决定了系统从哪下载元数据、用哪个公钥去验签。配置错误或被篡改,会导致后续所有校验失效甚至引入恶意包。
Debian/Ubuntu 的 sources.list 语法
每行定义一个软件源,格式为:
deb URI distribution component1 component2 ...
- deb:表示二进制包源(deb-src 表示源码包源)
-
URI:HTTP/HTTPS/FTP 地址,如
https://archive.ubuntu.com/ubuntu -
distribution:发行版代号,如
focal(Ubuntu 20.04)、jammy(22.04),必须与系统匹配 -
component:软件分类,常见有
main(官方支持)、universe(社区维护)、restricted(非自由固件)、multiverse(法律限制软件)
例如:deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu jammy main universe
RHEL/CentOS/Fedora 的 .repo 文件语法
每个源独立存为 /etc/yum.repos.d/*.repo,采用 INI 风格,关键字段如下:
-
[repo-id]:节名,唯一标识该源(如
[baseos]) - name=:人类可读名称(仅显示用)
-
baseurl=:实际镜像地址,支持
file://(本地)、http://、https://;多个 URL 可换行写,或用空格分隔 - enabled=:1 启用,0 禁用
- gpgcheck=:1 启用元数据签名校验(强制),0 禁用(不安全)
-
gpgkey=:指定对应公钥的完整 URL 或本地路径(如
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial) - repo_gpgcheck=(DNF 特有):对仓库元数据(repomd.xml.asc)启用额外签名校验
注意:mirrorlist= 和 metalink= 是动态获取镜像的替代方式,但会绕过 baseurl 的显式控制,调试时建议优先用 baseurl。
校验规则依赖的三个硬性前提
GPG 校验不是“自动生效”的,必须同时满足以下条件才真正起作用:
- gpgcheck=1 且 gpgkey 存在且可读:若 gpgkey 指向的文件不存在、权限不足或内容损坏,yum/dnf 会静默跳过校验或报错退出
- 元数据签名文件同步到位:例如 repomd.xml.asc 必须与 repomd.xml 同时存在且时间戳合理;若镜像站未同步 .asc 文件,校验必然失败
- 系统时间准确:GPG 签名含有效期,若系统时间偏差超过 ±5 分钟(常见于虚拟机或未启 NTP 的服务器),验签会直接拒绝
验证配置是否生效的实操方法
不要只看文件是否存在,要观察包管理器行为:
- 运行
sudo apt update(Debian/Ubuntu)或sudo dnf makecache(RHEL/Fedora),留意输出中是否出现Signing key expired、GPG error或NO_PUBKEY - 检查缓存元数据:
ls /var/lib/apt/lists/ | grep -i 'release.*gpg$'(APT)或ls /var/cache/dnf/*/metadata/repomd.xml.asc(DNF) - 手动验签测试:
gpg --verify /var/cache/dnf/baseos-*/metadata/repomd.xml.asc /var/cache/dnf/baseos-*/metadata/repomd.xml


















