Linux rpmsign 命令介绍
rpmsign(RPM Package Signing)是一个用于对 RPM 软件包进行签名管理的工具。它可以为软件包生成和插入新的签名,替换已有的签名,或者删除软件包的签名。它还可以使用 GPG 来对软件包进行签名,以提高软件包的安全性和可信度。
Linux rpmsign 命令适用的 Linux 版本
rpmsign 命令适用于大多数 Linux 发行版,但是在使用之前,需要先安装 rpm 包管理器。不同的 Linux 发行版可能使用不同的安装命令,下面是一些常见的安装命令:
# 对于基于 apt 的发行版(如 Debian、Ubuntu、Raspbian、Kali Linux 等):
sudo apt-get install rpm
# 对于基于 yum 的发行版(如 RedHat,CentOS 7 等):
sudo yum install rpm
# 对于基于 dnf 的发行版(如 Fedora,CentOS 8 等):
sudo dnf install rpm
# 对于基于 apk 的发行版(如 Alpine Linux):
sudo apk add --update rpm
# 对于基于 pacman 的发行版(如 Arch Linux):
sudo pacman -S rpm
# 对于基于 zypper 的发行版(如 openSUSE):
sudo zypper in rpm
# 对于基于 pkg 的 FreeBSD 发行版
sudo pkg install rpm
# 对于基于 pkg 的 OS X/macOS 发行版:
brew install rpm
Linux rpmsign 命令的基本语法
rpmsign 命令的基本语法格式如下:
rpmsign [选项] [软件包文件 ...]
其中,选项可以是以下之一:
--addsign
或--resign
:为每个软件包文件生成和插入新的签名,替换已有的签名。这两个选项的效果是一样的,只是为了兼容历史原因而保留的。--delsign
:删除每个软件包文件的所有签名。--delfilesign
:删除每个软件包文件的所有 IMA 和 fsverity 文件签名。--rpmv3
:强制添加 RPM V3 头部+有效载荷的签名。这些签名在有单独的有效载荷摘要的软件包(使用 rpm >= 4.14 构建的软件包)上是多余的,也会增加开销。rpm 会自动检测是否需要 V3 签名,但是如果软件包必须在 rpm < 4.14 上完全可验证,或者有其他的兼容性原因,可以使用这个选项强制创建 V3 签名。--fskpath
:与--signfiles
一起使用,指定文件签名密钥(RSA 私钥)的路径。--certpath
:与--signverity
一起使用,指定文件签名证书的路径。--verityalgo
:与--signverity
一起使用,指定签名算法。支持 sha256 和 sha512,如果不指定,默认为 sha256。也可以通过宏%_verity_algorithm
来指定。--signfiles
:对软件包文件进行签名。在构建软件包之前,必须设置宏%_binary_filedigest_algorithm
为一个支持的算法。支持的算法有 SHA1、SHA256、SHA384 和 SHA512,分别用 2、8、9 和 10 表示。在签名软件包之前,必须设置文件签名密钥(RSA 私钥),可以通过命令行选项--fskpath
或宏%_file_signing_key
来配置。--signverity
:对软件包文件进行 fsverity 签名。在签名软件包之前,必须设置文件签名密钥(RSA 私钥)和签名证书,可以通过命令行选项--fskpath
和--certpath
或宏%_file_signing_key
和%_file_signing_cert
来配置。
Linux rpmsign 命令的常用选项或参数说明
下表列出了 rpmsign 命令的一些常用选项或参数及其说明,按照字母顺序排序:
选项或参数 | 说明 |
---|---|
--addsign | 为每个软件包文件生成和插入新的签名,替换已有的签名 |
--certpath | 与 --signverity 一起使用,指定文件签名证书的路径 |
--delfilesign | 删除每个软件包文件的所有 IMA 和 fsverity 文件签名 |
--delsign | 删除每个软件包文件的所有签名 |
--fskpath | 与 --signfiles 一起使用,指定文件签名密钥(RSA 私钥)的路径 |
--resign | 为每个软件包文件生成和插入新的签名,替换已有的签名 |
--rpmv3 | 强制添加 RPM V3 头部+有效载荷的签名 |
--signfiles | 对软件包文件进行签名 |
--signverity | 对软件包文件进行 fsverity 签名 |
--verityalgo | 与 --signverity 一起使用,指定签名算法 |
Linux rpmsign 命令实例详解
下面是一些 rpmsign 命令的常见实例,结合了最常搜索的关键词,以及不同的选项和参数的组合。每个实例都给出了相关的解释和代码示例。
实例1:为软件包添加签名
这个实例演示了如何为一个或多个软件包文件添加签名,使用 --addsign
或 --resign
选项。在执行命令之前,需要先配置好 GPG 的密钥和相关的宏,具体参见使用 GPG 来签名软件包部分。执行命令时,会提示输入 GPG 的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --addsign foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
bar-2.0-1.x86_64.rpm:
实例2:删除软件包的签名
这个实例演示了如何删除一个或多个软件包文件的所有签名,使用 --delsign
选项。执行命令后,软件包文件就不再包含任何签名信息。
[linux@bashcommandnotfound.cn ~]$ rpmsign --delsign foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
foo-1.0-1.x86_64.rpm:
bar-2.0-1.x86_64.rpm:
实例3:删除软件包的文件签名
这个实例演示了如何删除一个或多个软件包文件的所有 IMA 和 fsverity 文件签名,使用 --delfilesign
选项。执行命令后,软件包文件就不再包含这些文件签名信息,但是其他的签名信息仍然保留。
[linux@bashcommandnotfound.cn ~]$ rpmsign --delfilesign xx.rpm
实例4:为软件包添加 V3 签名
这个实例演示了如何为一个或多个软件包文件添加 V3 签名,使用 --rpmv3
选项。这个选项一般用于兼容老版本的 rpm,或者有特殊的需求。执行命令时,会提示输入 GPG 的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --rpmv3 --addsign foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
bar-2.0-1.x86_64.rpm:
实例5:为软件包文件进行签名
这个实例演示了如何为一个或多个软件包文件进行签名,使用 --signfiles
选项。这个选项可以提高软件包文件的安全性和完整性,防止被篡改或损坏。在执行命令之前,需要先配置好文件签名密钥(RSA 私钥),可以通过命令行选项 --fskpath
或宏 %_file_signing_key
来配置。执行命令时,会提示输入文件签名密钥的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --signfiles --fskpath /path/to/private.key foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
Enter pass phrase for /path/to/private.key:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
bar-2.0-1.x86_64.rpm:
实例6:为软件包文件进行 fsverity 签名
这个实例演示了如何为一个或多个软件包文件进行 fsverity 签名,使用 --signverity
选项。这个选项可以利用 Linux 内核的 fsverity 功能,为软件包文件提供更高的安全性和完整性,防止被篡改或损坏。在执行命令之前,需要先配置好文件签名密钥(RSA 私钥)和签名证书,可以通过命令行选项 --fskpath
和 --certpath
或宏 %_file_signing_key
和 %_file_signing_cert
来配置。执行命令时,会提示输入文件签名密钥的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --signverity --fskpath /path/to/private.key --certpath /path/to/cert.pem foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
Enter pass phrase for /path/to/private.key:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
bar-2.0-1.x86_64.rpm:
实例7:为软件包指定签名算法
这个实例演示了如何为一个或多个软件包文件指定签名算法,使用 --verityalgo
选项。这个选项可以与 --signverity
一起使用,来选择 sha256 或 sha512 作为签名算法。如果不指定这个选项,默认为 sha256。也可以通过宏 %_verity_algorithm
来指定签名算法。执行命令时,会提示输入密钥的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --signverity --fskpath /path/to/key --certpath /path/to/cert --verityalgo sha512 foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
bar-2.0-1.x86_64.rpm:
实例8:查看软件包的签名信息
这个实例演示了如何查看一个或多个软件包文件的签名信息,使用 rpm 命令的 -K
或 --checksig
选项。这个选项可以用于验证软件包的签名是否有效,以及显示签名的类型和摘要。如果软件包没有签名,或者签名无效,会显示相应的错误信息。
[linux@bashcommandnotfound.cn ~]$ rpm -K foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
foo-1.0-1.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
bar-2.0-1.x86_64.rpm: rsa sha256 (md5) pgp sha256 OK
实例9:使用 GPG 来签名软件包
这个实例演示了如何使用 GPG 来签名一个或多个软件包文件,使用 --addsign
或 --resign
选项。在执行命令之前,需要先配置好 GPG 的密钥和相关的宏,具体参见[使用 GPG 来签名软件包]部分。执行命令时,会提示输入 GPG 的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --addsign foo-1.0-1.x86_64.rpm bar-2.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
bar-2.0-1.x86_64.rpm:
实例10:为软件包指定签名密钥
这个实例演示了如何为一个或多个软件包文件指定签名密钥,使用 --fskpath
选项。这个选项可以与 --signfiles
或 --signverity
一起使用,来选择不同的文件签名密钥(RSA 私钥)。如果不指定这个选项,默认使用宏 %_file_signing_key
的值。执行命令时,会提示输入密钥的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --signfiles --fskpath /path/to/key1 foo-1.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
[linux@bashcommandnotfound.cn ~]$ rpmsign --signverity --fskpath /path/to/key2 --certpath /path/to/cert bar-2.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
bar-2.0-1.x86_64.rpm:
实例11:为软件包指定签名证书
这个实例演示了如何为一个或多个软件包文件指定签名证书,使用 --certpath
选项。这个选项只能与 --signverity
一起使用,来选择不同的文件签名证书。如果不指定这个选项,默认使用宏 %_file_signing_cert
的值。执行命令时,会提示输入密钥的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --signverity --fskpath /path/to/key --certpath /path/to/cert1 foo-1.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
[linux@bashcommandnotfound.cn ~]$ rpmsign --signverity --fskpath /path/to/key --certpath /path/to/cert2 bar-2.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
bar-2.0-1.x86_64.rpm:
实例12:为软件包指定签名宏
这个实例演示了如何为一个或多个软件包文件指定签名宏,使用 --define
选项。这个选项可以用于覆盖默认的宏值,如 %_gpg_name
、%_file_signing_key
、%_file_signing_cert
等。执行命令时,会提示输入密钥的密码,输入后即可完成签名的过程。
[linux@bashcommandnotfound.cn ~]$ rpmsign --addsign --define '_gpg_name Package Manager 2 <pmanager2@example.com>' foo-1.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
foo-1.0-1.x86_64.rpm:
[linux@bashcommandnotfound.cn ~]$ rpmsign --signfiles --define '_file_signing_key /path/to/key2' bar-2.0-1.x86_64.rpm
Enter pass phrase:
Pass phrase is good.
bar-2.0-1.x86_64.rpm:
使用 GPG 来签名软件包
在使用 GPG 来签名软件包时,需要先生成一个 GPG 密钥对,并配置 rpm 的相关宏。以下是具体的步骤:
- 生成一个 GPG 密钥对,可以使用
gpg --gen-key
命令,按照提示输入相关信息,如姓名、邮箱、密码等。也可以使用其他的工具或方法来生成密钥对。 - 查看生成的密钥,可以使用
gpg --list-keys
命令,找到密钥的 ID,如B74246CE
。 - 导出公钥,可以使用
gpg --export -a 'Package Manager' > RPM-GPG-KEY-pmanager
命令,将公钥保存到一个文件中,以便后续使用。 - 配置 rpm 的相关宏,可以在
~/.rpmmacros
文件中添加以下内容,其中%_gpg_name
应该与密钥的 ID 或姓名邮箱一致,%_gpg_path
应该指向密钥的存放路径,%__gpg
应该指向 gpg 的可执行文件路径。
%_signature gpg
%_gpg_path /home/pmanager/.gnupg
%_gpg_name Package Manager <pmanager@example.com>
%__gpg /usr/bin/gpg
- 签名软件包,可以使用
rpmsign --addsign
或--resign
选项,按照[实例9:使用 GPG 来签名软件包]部分的方法进行操作。
Linux rpmsign 命令的注意事项
在使用 rpmsign 命令时,有以下几点需要注意:
- 在对软件包进行签名之前,需要先配置好 GPG 的密钥和相关的宏。
- 在对软件包文件进行签名或 fsverity 签名之前,需要先配置好文件签名密钥(RSA 私钥)和签名证书。
- 如果在执行 rpmsign 命令时,出现
bash: rpmsign: command not found
的错误,说明没有安装 rpm 包管理器,需要按照Linux rpmsign 命令适用的 Linux 版本部分的方法进行安装。
评论区