侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux rpmsign命令教程:如何对 RPM 软件包进行签名管理(附实例详解和注意事项)

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 的相关宏。以下是具体的步骤:

  1. 生成一个 GPG 密钥对,可以使用 gpg --gen-key 命令,按照提示输入相关信息,如姓名、邮箱、密码等。也可以使用其他的工具或方法来生成密钥对。
  2. 查看生成的密钥,可以使用 gpg --list-keys 命令,找到密钥的 ID,如 B74246CE
  3. 导出公钥,可以使用 gpg --export -a 'Package Manager' > RPM-GPG-KEY-pmanager 命令,将公钥保存到一个文件中,以便后续使用。
  4. 配置 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
  1. 签名软件包,可以使用 rpmsign --addsign--resign 选项,按照[实例9:使用 GPG 来签名软件包]部分的方法进行操作。

Linux rpmsign 命令的注意事项

在使用 rpmsign 命令时,有以下几点需要注意:

  • 在对软件包进行签名之前,需要先配置好 GPG 的密钥和相关的宏。
  • 在对软件包文件进行签名或 fsverity 签名之前,需要先配置好文件签名密钥(RSA 私钥)和签名证书。
  • 如果在执行 rpmsign 命令时,出现 bash: rpmsign: command not found 的错误,说明没有安装 rpm 包管理器,需要按照Linux rpmsign 命令适用的 Linux 版本部分的方法进行安装。
0

评论区