如何为 RPM 包签名
Lapin Gris Lv3

Generate GPG keyring

使用下面的命令生成 GPG keyring。输入 Name 和 Email 。输入 o 确认后,passphrase 可以不输入(保留为空即可),passphrase 保留为空代表不需要密码保护(公钥和私钥需要确认两次)。

gpg --gen-key

查看生成的 GPG key

gpg -K

rpmsign

导出公钥,生成一个公钥文件,此公钥文件通常根据用途不同放到 repo 源中,或者直接导入系统用于安装 RPM 时进行 GPG 验证。

gpg --armor --export > RPM-GPG-KEY-EXAMPLE

将所有的 RPM 包进行签名

rpmsign --define "_gpg_name security@example.com" --addsign *.rpm

migrate GPG keyring

1、export GPG keyring

-a, –armor, 以 ascii 方式导出

# export public key
gpg -a --export >mypubkeys.asc
# export private key
gpg -a --export-secret-keys >myprivatekeys.asc

2、export GPG trustdb (Optionally)

# export gpg's trustdb (Optionally)
gpg --export-ownertrust >mytrustdb.txt

3、import GPG keyring

gpg --import myprivatekeys.asc
gpg --import mypubkeys.asc

# list public & secret keys
gpg -K
gpg -k

4、import trustdb

gpg --import-ownertrust mytrustdb.txt

当我们导入 GPG keyrings 时,GPG 并不信任 keyrings,需要导入 trustdb 后,并更新下 trustdb

gpg --update-trustdb

5、force trust GPG keyring

如果没有导入 trustdb,GPG 认为 keys 不可信。可以使用下面的命令信任所有的 GPG keyrings。

注意,只信任自己创建的 keyring,不要信任互联网的其他 keyring。

gpg --list-keys --fingerprint |grep pub -A 1|egrep -Ev "pub|--"|tr -d ' ' \
| awk 'BEGIN { FS = "\n" } ; { print $1":6:" } ' | gpg --import-ownertrust

搭配 OBS 使用

OBS(Open Build Service) 是一个可以用于为各个发行版打包的编译系统。OBS 系统默认会使用自己生成的签名,但是如果能让 OBS 系统使用我们自己的签名不是很好,接下来就介绍如何让 OBS 使用我们的 GPG Keyring 为 RPM 包进行签名。

平时我们使用 rpmbuild 命令在虚拟机或者 docker 中打包的时候签名的公钥都是存放在 ~/.gnupg 目录下,这也是 gpg -k 等命令的默认搜索路径,但是 OBS 是一个单独的系统,他的配置都放在单独的 /srv 目录下。rpmsign 使用的公钥的存放目录是 /srv/obs/gnupg

因此,只需要在导入 GPG Keyring 时候,通过 --homedir 指定目录即可,

gpg --import  my-publickey.asc
gpg --import my-privatekey.asc
gpg --import-ownertrust my-gpgtrustdb.txt

FAQ

为什么需要迁移 GPG keyring

进行 RPM 打包的时候,都会给 RPM 包签名。同一个发行商都会给 RPM 包签名,不同的 build system,比如 OBS(open build service),Koji 等都可以实现自动签名。我们可以导入 GPG keyring,而不是让构建系统自己生成一个。

为什么需要导入 trustdb?

如果不导入 trustdb,当导入迁移后的 GPG keyring 时,GPG keyring 状态变为 unknown。

[root@localhost ~]# gpg -K
/root/.gnupg/pubring.kbx
------------------------
sec rsa3072 2022-11-02 [SC] [expires: 2024-11-01]
024B8C9501E35519D203B3B6DCD37021E3793FD6
uid [ultimate] security <@example.com>
ssb rsa3072 2022-11-02 [E] [expires: 2024-11-01]
[root@localhost ~]# gpg -K
/root/.gnupg/pubring.kbx
------------------------
sec rsa3072 2022-11-02 [SC] [expires: 2024-11-01]
024B8C9501E35519D203B3B6DCD37021E3793FD6
uid [unknown] security <@example.com>
ssb rsa3072 2022-11-02 [E] [expires: 2024-11-01]

Reference

1、https://access.redhat.com/solutions/2115511

2、https://docs.pagure.org/koji/signing/

3、https://unix.stackexchange.com/questions/639514/unknown-validity-despite-having-signed-the-key-myself

4、https://stackoverflow.com/questions/53886734/how-to-trust-a-bunch-of-public-pgp-keys-you-trust-without-doing-it-manually

5、https://www.gnupg.org/documentation/manuals/gnupg/GPG-Configuration.html