)
Linux命令-rpmsignRPM 包数字签名工具 —— 为软件包添加可信身份标识 简介安装位置 语法⚙️ 选项 示例示例 1生成 GPG 密钥对前置准备示例 2对 RPM 包添加签名示例 3重新签名和删除签名示例 4批量签名多个包示例 5签名验证与公钥分发示例 6完整的企业签名工作流示例 7GPG 密钥到期更新流程⚠️ 注意签名 vs 校验和密钥安全管理各发行版差异 总结 相关命令快速参考rpmsign是用于对 RPM 包文件进行 GPG 数字签名的工具。数字签名确保软件包在分发过程中未被篡改且来源可信。在 RedHat/CentOS 生态中所有官方仓库的 RPM 包都带有 GPG 签名用户通过导入公钥来验证包的合法性。自定义打包或私有仓库场景下需要对自建包进行签名。 简介rpmsign通过调用 GPGGNU Privacy Guard对.rpm包文件添加数字签名。签名信息嵌入在 RPM 包的 header 区域使用 RSA 等非对称加密算法生成。签名的两个核心安全保证完整性包文件内容的任何修改都会导致签名验证失败认证性只有持有对应私钥的人才能生成有效签名安装位置# 查看 rpmsign 路径whichrpmsign# 输出/usr/bin/rpmsign# rpmsign 属于 rpm-sign 包rpm-qf/usr/bin/rpmsign# 输出rpm-sign-4.11.3-48.el7.x86_64# 安装如果未安装# CentOS/RHEL 7sudoyuminstallrpm-sign# CentOS/RHEL 8sudodnfinstallrpm-sign# Debian/Ubuntu 无此工具使用 dpkg-sig 语法rpmsign [选项] 包文件...操作模式分为签名和验证两类模式选项说明添加签名--addsign为无签名的包添加签名重新签名--resign覆盖已有签名用新密钥重签删除签名--delsign从包中移除签名验证签名-K, --checksig验证包的 GPG 签名有效性⚙️ 选项选项说明--addsign添加 GPG 签名包之前无签名--resign重新签名覆盖已存在的签名--delsign删除已有的签名-K, --checksig验证 RPM 包的签名--signfiles对包内文件进行签名--key-id 密钥ID指定要使用的 GPG 密钥 ID不指定则用默认--define _gpg_name 名称通过宏指定 GPG 密钥的用户名或邮箱--define _gpg_path 路径指定 GNUPGHOME 路径--passphrase 密码指定私钥密码不安全仅脚本场景用⚠️安全提示永远不要在生产脚本中硬编码 GPG 私钥密码。使用gpg-agent或设置环境变量管理密码。 示例示例 1生成 GPG 密钥对前置准备# 生成用于 RPM 签名的 GPG 密钥gpg --full-generate-key# 交互式向导# Please select what kind of key you want:# (1) RSA and RSA (default)# (4) RSA (sign only)# Your selection? 1# RSA keys may be between 1024 and 4096 bits long.# What keysize do you want? (3072) 4096# Key is valid for? (0) 2y# Real name: MyCompany RPM Builder# Email address: rpmmycompany.com# Comment: RPM Package Signing Key# Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O# 输出# gpg: key 3A1B2C3D4E5F6A7B marked as ultimately trusted# gpg: revocation certificate stored as ...# pub rsa4096 2026-06-14 [SC] [expires: 2028-06-13]# 3A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B# uid MyCompany RPM Builder rpmmycompany.com# 记住你的密钥ID短期ID用后8位# 密钥ID: 6E7F8A9B# 查看已有密钥gpg --list-keys# 输出# /root/.gnupg/pubring.kbx# ------------------------# pub rsa4096 2026-06-14 [SC] [expires: 2028-06-13]# 3A1B2C3D4E5F6A7B8C9D0E1F2A3B4C5D6E7F8A9B# uid [ultimate] MyCompany RPM Builder rpmmycompany.com示例 2对 RPM 包添加签名# 先构建一个自定义 RPM 包示例rpmbuild-bamyapp.specls~/rpmbuild/RPMS/x86_64/# 输出myapp-1.0-1.el7.x86_64.rpm# 方式1通过宏指定 GPG 密钥名称rpmsign--addsign\--define_gpg_name MyCompany RPM Builder\~/rpmbuild/RPMS/x86_64/myapp-1.0-1.el7.x86_64.rpm# 输出提示输入私钥密码# Enter passphrase:# Passphrase is good.# myapp-1.0-1.el7.x86_64.rpm: signed# 方式2通过密钥ID 指定rpmsign--addsign\--define_gpg_name 6E7F8A9B\~/rpmbuild/RPMS/x86_64/myapp-1.0-1.el7.x86_64.rpm# 验证签名是否添加成功rpm-K~/rpmbuild/RPMS/x86_64/myapp-1.0-1.el7.x86_64.rpm# 输出# myapp-1.0-1.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK示例 3重新签名和删除签名# 重新签名覆盖已有签名用于密钥更新rpmsign--resign\--define_gpg_name MyCompany RPM Builder (2028)\myapp-1.0-1.el7.x86_64.rpm# 输出# Enter passphrase:# Passphrase is good.# myapp-1.0-1.el7.x86_64.rpm: signed# 删除签名rpmsign--delsignmyapp-1.0-1.el7.x86_64.rpm# 输出# myapp-1.0-1.el7.x86_64.rpm: signature removed# 验证签名已删除rpm-Kmyapp-1.0-1.el7.x86_64.rpm# 输出# myapp-1.0-1.el7.x86_64.rpm: MISSING KEYS: (MD5) PGP#3a1b2c3d# (NOT OK)示例 4批量签名多个包# 对目录下所有 RPM 包批量签名forrpmfilein~/rpmbuild/RPMS/x86_64/*.rpm;doechoSigning:$rpmfilerpmsign--addsign\--define_gpg_name MyCompany RPM Builder\$rpmfiledone# 输出# Signing: /root/rpmbuild/RPMS/x86_64/myapp-1.0-1.el7.x86_64.rpm# Enter passphrase:# Passphrase is good.# myapp-1.0-1.el7.x86_64.rpm: signed# Signing: /root/rpmbuild/RPMS/x86_64/mylib-2.0-1.el7.x86_64.rpm# mylib-2.0-1.el7.x86_64.rpm: signed# 验证所有包forrpmfilein~/rpmbuild/RPMS/x86_64/*.rpm;doecho$rpmfilerpm-K$rpmfiledone# 输出# myapp-1.0-1.el7.x86_64.rpm # myapp-1.0-1.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK# mylib-2.0-1.el7.x86_64.rpm # mylib-2.0-1.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK示例 5签名验证与公钥分发# 1. 导出公钥给用户gpg--export-aMyCompany RPM BuilderRPM-GPG-KEY-mycompanycatRPM-GPG-KEY-mycompany# 输出# -----BEGIN PGP PUBLIC KEY BLOCK-----# mQINBGZt...# ... (Base64编码的公钥数据)# -----END PGP PUBLIC KEY BLOCK-----# 2. 用户导入公钥sudorpm--importRPM-GPG-KEY-mycompany# 或从本地文件导入sudorpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY-mycompany# 3. 验证导入的公钥rpm-qagpg-pubkey*|grep-imycompany# 输出gpg-pubkey-6e7f8a9b-667d1a2b# 4. 安装签名的包sudoyuminstallmyapp-1.0-1.el7.x86_64.rpm# 输出# Importing GPG key 0x6E7F8A9B:# Userid : MyCompany RPM Builder rpmmycompany.com# Fingerprint: 3A1B 2C3D 4E5F 6A7B 8C9D 0E1F 2A3B 4C5D 6E7F 8A9B# From : /etc/pki/rpm-gpg/RPM-GPG-KEY-mycompany# Is this ok [y/N]: y# 5. 验证已安装包的签名rpm-q--qf%{SIGPGP:pgpsig}\nmyapp|head-5# 输出签名信息示例 6完整的企业签名工作流# 配置 RPM 签名宏避免每次指定密钥名cat~/.rpmmacrosEOF %_signature gpg %_gpg_path /home/builder/.gnupg %_gpg_name MyCompany RPM Builder %_gpgbin /usr/bin/gpg EOF# 验证宏配置rpm--showrc|grep-E_gpg_name|_signature|_gpg_path# 输出# -14: _gpg_name MyCompany RPM Builder# -14: _gpg_path /home/builder/.gnupg# -14: _gpgbin /usr/bin/gpg# -14: _signature gpg# 现在签名时无需额外参数rpmsign--addsignmyapp-1.0-1.el7.x86_64.rpm# 输出# Enter passphrase:# Passphrase is good.# myapp-1.0-1.el7.x86_64.rpm: signed# 在 spec 文件中也可以使用签名# %__gpg_sign_cmd %{__gpg} gpg --force-v3-sigs --yes --digest-algosha256 ...# 构建签名一体化rpmbuild-ba--signmyapp.spec# 构建完成后自动调用 rpmsign 添加签名示例 7GPG 密钥到期更新流程# 查看密钥有效期gpg --list-keysMyCompany RPM Builder# 输出# pub rsa4096 2026-06-14 [SC] [expires: 2028-06-13]# uid [ultimate] MyCompany RPM Builder rpmmycompany.com# 到期日期2028-06-13# 延长密钥有效期gpg --edit-keyMyCompany RPM Builder# gpg expire# Changing expiration time for the primary key.# Please specify how long the key should be valid.# Key is valid for? (0) 2y# gpg save# 导出新公钥gpg--export-aMyCompany RPM BuilderRPM-GPG-KEY-mycompany-v2# 对已有包重新签名使用更新的密钥rpmsign--resign~/rpmbuild/RPMS/x86_64/*.rpm⚠️ 注意签名 vs 校验和# MD5/SHA 校验和 ≠ 数字签名# 校验和只能验证完整性不能验证来源身份# 数字签名同时验证完整性和来源身份# 校验和示例任何人都能生成md5sum myapp.rpm# 输出d41d8cd98f00b204e9800998ecf8427e myapp.rpm# 数字签名示例只有私钥持有者能生成rpm-Kmyapp.rpm# 输出myapp.rpm: rsa sha1 (md5) pgp md5 OK# ^^^^签名算法 ^^^^^^^验证结果密钥安全管理# GPG 密钥文件位置ls-la~/.gnupg/# 输出# -rw------- 1 builder builder 1234 Jun 14 10:00 pubring.kbx# -rw------- 1 builder builder 5678 Jun 14 10:00 private-keys-v1.d/...# -rw------- 1 builder builder 890 Jun 14 10:00 trustdb.gpg# ⚠️ 关键安全措施# 1. 私钥文件权限必须为 600 (仅所有者可读写)chmod700~/.gnupgchmod600~/.gnupg/*# 2. 生成吊销证书安全存放gpg --gen-revokeMyCompany RPM Builderrevocation-cert.asc# 保存到离线存储中# 3. 构建服务器上只存放签名子密钥# 主密钥离线保存仅生成子密钥用于每日签名gpg --edit-keyMyCompany RPM Builder# gpg addkey# (创建仅用于签名的子密钥)各发行版差异# CentOS/RHEL 7rpm--showrc|grepsignature# 使用 GPG v1/v2签名算法RSA SHA1# CentOS/RHEL 8/9rpm--showrc|grepsignature# 使用 GPG v2签名算法RSA SHA256默认# Fedora 36# 默认要求 SHA256 以上签名算法# 低版本 SHA1 签名的包会被 yum/dnf 拒绝 总结rpmsign是 RPM 包分发安全链条中的关键一环核心功能为 RPM 包添加、覆盖、删除 GPG 数字签名与 rpm -K 的关系rpmsign是签名工具写签名rpm -K是验证工具读签名前置依赖必须有一套 GPG 密钥对~/.gnupg/最佳实践主密钥离线保存构建服务器上仅使用签名子密钥注意签名≠校验和签名提供身份认证校验和仅保证完整性 相关命令命令说明gpgGNU 隐私卫士 —— 生成和管理 GPG 密钥对rpm -K验证 RPM 包的 GPG 签名rpm --import导入 GPG 公钥到 RPM 信任数据库rpmbuild关联构建 RPM 包可--sign构建时签名rpmRPM 包管理核心命令yum/dnf上层包管理器安装前自动验证签名