荣涛 2022-07-08
日期 | 修改内容 | 修改人 | 备注 |
---|---|---|---|
2022-07-08 | 创建 | 荣涛 |
RPM 包签名可用于实现 RPM 包的加密完整性检查。这种方法是端到端的,因为供应商的软件包构建基础设施可以使用离线或半在线私钥(例如存储在硬碟安全模组中的私钥) ,而使用这些软件包的最终系统可以直接验证签名,因为这些签名是内置在。转速包文件。代理和缓存(有时用于将生产服务器与 Internet 分离)等中间设备不能篡改这些签名。
下面的步骤描述了生成 GPG 密钥和使用该密钥签名 RPM 的过程。
# 生成 gpg 密钥对
$ gpg --gen-key
# 查看 gpg 密钥
$ gpg --list-keys
$ rpm -qi gpg-pubkey
# 保存公钥
$ gpg --export -a 'Rong Tao' > RPM-GPG-KEY-rongtao
# 导入公钥
$ sudo rpm --import RPM-GPG-KEY-rongtao
# 为 rpm 包签名
$ rpm --addsign zstd-1.4.4-1.cl8.x86_64.rpm
# 检查签名
$ rpm --checksig zstd-1.4.4-1.cl8.x86_64.rpm
$ rpm -v --checksig zstd-1.4.4-1.cl8.x86_64.rpm
# 查看详细信息(签名算法)
$ rpm -q --qf '%{SIGPGP:pgpsig} %{SIGGPG:pgpsig}\n' -p zstd-1.4.4-1.cl8.x86_64.rpm
# 删除 rpm 签名
$ rpm --delsign zstd-1.4.4-1.cl8.x86_64.rpm
$ gpg --gen-key
期间将提示你输入用户名和邮箱
$ gpg --gen-key
[... 省略一些行]
Real name: Rong Tao
Email address: [email protected]
You selected this USER-ID:
"Rong Tao <[email protected]>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
[... 省略一些行]
public and secret key created and signed.
pub rsa2048 2022-07-08 [SC] [expires: 2024-07-07]
7DD6D1BC7622264D5B0667153F2FA11D3D67D70B
uid Rong Tao <[email protected]>
sub rsa2048 2022-07-08 [E] [expires: 2024-07-07]
$ gpg --list-keys
输出为
$ gpg --list-keys
/home/rongtao/.gnupg/pubring.kbx
--------------------------------
pub rsa2048 2022-07-08 [SC] [expires: 2024-07-07]
7DD6D1BC7622264D5B0667153F2FA11D3D67D70B
uid [ultimate] Rong Tao <[email protected]>
sub rsa2048 2022-07-08 [E] [expires: 2024-07-07]
也可以用 rpm
命令查看完整信息
$ rpm -qi gpg-pubkey
# ‘Rong Tao’ 为生成密钥对过程的 ‘Real name: Rong Tao’
$ gpg --export -a 'Rong Tao'
$ gpg --export -a 'Rong Tao'
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQGNBGLHhywBDACixZALQyorrr4lUCiu/PDmSihI72+1yfN+mPoSu+QdIA1A0GPM
[省略很多行]
vFdLRyPUBWjvfQib3YTRiQPubV41W6dTq1x0Yj9RxScNoVQmP6SkAOSNI21T7m2Q
wTKwAJxTtn0a3VJ2/SgriLLRYfd4Rg==
=Kv54
-----END PGP PUBLIC KEY BLOCK-----
将其保存到文件
$ gpg --export -a 'Rong Tao' > RPM-GPG-KEY-rongtao
$ sudo rpm --import RPM-GPG-KEY-rongtao
- 列出已导入的 gpg key
# 简要信息
$ rpm -q gpg-pubkey
gpg-pubkey-3a9aa709-62ac1c98
gpg-pubkey-3d67d70b-62c786a5
# 详细信息
$ rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
gpg-pubkey-3a9aa709-62ac1c98 --> gpg(My Build Service <obsrun@localhost>)
gpg-pubkey-3d67d70b-62c786a5 --> gpg(Rong Tao <[email protected]>)
- 首先为使用 gpg key 修改或创建
~/.rpmmacros
,文件内容:
%_signature gpg
%_gpg_path /root/.gnupg
%_gpg_name Rong Tao
%_gpgbin /usr/bin/gpg2
%__gpg_sign_cmd %{__gpg} gpg --force-v3-sigs --batch --verbose --no-armor --passphrase-fd 0 --no-secmem-warning -u "%{_gpg_name}" -sbo %{__signature_filename} --digest-algo sha256 %{__plaintext_filename}'
注意需要改的几项:
- _gpg_path: 改为自己生成 gnupg 的路径
- _gpg_name: 改为生成过程的
Real name: Rong Tao
- --passphrase-fd: 在红帽原文档中这个值为
3
有问题,改为0
后正常
以为上述宏存在问题[#]
%_signature gpg
%_gpg_path /root/.gnupg
%_gpg_name Rong Tao
%_gpgbin /usr/bin/gpg
- 为 rpm 包签名
$ rpm --addsign zstd-1.4.4-1.cl8.x86_64.rpm
- 检查签名
也就是是否能装到本机上的检查是否通过
$ rpm --checksig zstd-1.4.4-1.cl8.x86_64.rpm
也可以显示详细信息
$ rpm -v --checksig zstd-1.4.4-1.cl8.x86_64.rpm
zstd-1.4.4-1.cl8.x86_64.rpm:
Header V3 RSA/SHA1 Signature, key ID ec6c7238: NOKEY
Header SHA256 digest: OK
Header SHA1 digest: OK
Payload SHA256 digest: OK
V3 RSA/SHA1 Signature, key ID ec6c7238: NOKEY
MD5 digest: OK
- 查看详细信息(签名算法)
$ rpm -q --qf '%{SIGPGP:pgpsig} %{SIGGPG:pgpsig}\n' -p zstd-1.4.4-1.cl8.x86_64.rpm
$ rpm --delsign zstd-1.4.4-1.cl8.x86_64.rpm
上面会生成.gnupg
文件夹,对应的详细信息
# 详细信息
$ rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n'
gpg-pubkey-3a9aa709-62ac1c98 --> gpg(My Build Service <obsrun@localhost>)
gpg-pubkey-3d67d70b-62c786a5 --> gpg(Rong Tao <[email protected]>)
# 签名
$ rpm --addsign zstd-1.4.4-1.cl8.x86_64.rpm
zstd-1.4.4-1.cl8.x86_64.rpm:
error: zstd-1.4.4-1.cl8.x86_64.rpm: open failed: Permission denied
# rpm 坏了??
$ rpm -qpi zstd-1.4.4-1.cl8.x86_64.rpm
error: zstd-1.4.4-1.cl8.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 3d67d70b: BAD
error: zstd-1.4.4-1.cl8.x86_64.rpm: not an rpm package (or package manifest)
# 查看详细信息
$ rpm -v --checksig zstd-1.4.4-1.cl8.x86_64.rpm
zstd-1.4.4-1.cl8.x86_64.rpm:
Header V4 RSA/SHA256 Signature, key ID ba79374d: BAD
Header SHA256 digest: OK
Header SHA1 digest: OK
Payload SHA256 digest: OK
V4 RSA/SHA256 Signature, key ID ba79374d: BAD
MD5 digest: OK
# 删除后再次查看
$ rpm --delsign zstd-1.4.4-1.cl8.x86_64.rpm
zstd-1.4.4-1.cl8.x86_64.rpm:
$ rpm -v --checksig zstd-1.4.4-1.cl8.x86_64.rpm
zstd-1.4.4-1.cl8.x86_64.rpm:
Header SHA256 digest: OK
Header SHA1 digest: OK
Payload SHA256 digest: OK
MD5 digest: OK
删除签名,重新签名
$ rpm --delsign zstd-1.4.4-1.cl8.x86_64.rpm
- 为什么出现这个问题?
Header V4 RSA/SHA256 Signature, key ID ba79374d: BAD
V4 RSA/SHA256 Signature, key ID ba79374d: BAD
有个相同的问题 Header V4 RSA/SHA1 Signature, key ID 7bd9bf62: BAD,但是原因并不一样。
不得不说,GitHub:How to sign your custom RPM package with GPG key 的方法比红帽How to sign rpms with GPG的方法更成功,解决了这个问题。
- Redhat:How to sign rpms with GPG
- GitHub:How to sign your custom RPM package with GPG key,fork的Rtoax/rpm-digital-signature.sh
Copyright (C) CESTC Com.
RedHat: How to sign rpms with GPG