RPM验签

概述

openEuler当前采用RPM格式的软件包管理,RPM采用符合openPGP签名规范,openEuler-24.03-LTS-SP1版本发布的RPM软件在开源版本的基础上增加了对SM2/3算法的签名/验签功能支持。

对如下软件包进行商密使能:

  • GnuPG:gpg命令行应用程序支持生成国密签名
  • RPM:支持调用gpg命令以及openSSL API实现国密签名生成/验证
  • openSSL:支持国密签名验证(开源已支持)

前置条件

  1. openEuler操作系统安装的gnupg2、libgcrypt、rpm软件版本号需大于等于如下版本:

    sh
    $ rpm -qa libgcrypt
    libgcrypt-1.10.2-3.oe2403sp1.x86_64
    
    $ rpm -qa gnupg2
    gnupg2-2.4.3-5.oe2403sp1.x86_64
    
    $ rpm -qa rpm
    rpm-4.18.2-20.oe2403sp1.x86_64
  2. ecdsa的签名及验签仅支持sm2的

使用方法

  1. 生成秘钥

    方法1:

    sh
    $ gpg --full-generate-key --expert

    方法2:

    sh
    $ gpg --quick-generate-key <密钥标识> sm2p256v1

    中间会要求输入密码,后续操作秘钥或签名需要输入密码,若直接不输入,按回车,则表示无密码。

  2. 导出证书

    sh
    $ gpg -o <证书路径> --export <密钥标识>
  3. 打开配置sm3哈希算法和sm2算法的宏

    sh
    $ vim /usr/lib/rpm/macros
    %_enable_sm2p256v1_sm3_algo     1
  4. 将证书导入rpm数据库

    sh
    $ rpm --import <证书路径>
  5. 编写签名所需的macro

    sh
     $ vim ~/.rpmmacros
     %_signature gpg
     %_gpg_path /root/.gnupg
     %_gpg_name <密钥标识>
     %_gpgbin /usr/bin/gpg2
    
     %__gpg_sign_cmd                 %{shescape:%{__gpg}} \
             gpg --no-verbose --no-armor --no-secmem-warning --passphrase-file /root/passwd \
             %{?_gpg_digest_algo:--digest-algo=%{_gpg_digest_algo}} \
             %{?_gpg_sign_cmd_extra_args} \
             %{?_gpg_name:-u %{shescape:%{_gpg_name}}} \
             -sbo %{shescape:%{?__signature_filename}} \
             %{?__plaintext_filename:-- %{shescape:%{__plaintext_filename}}}

    其中%__gpg_sign_cmd信息为默认信息加上了--passphrase-file /root/passwd,passwd文件存的是密码,若步骤1没有设置密码,则无需添加。

  6. 生成RPM包签名

    sh
    $ rpmsign --addsign <RPM文件>
  7. 验证RPM包签名

    sh
    $ rpm -Kv <RPM文件>

    如果输出中显示“Header V4 ECDSA/SM3 Signature”,并且显示“OK”,则说明签名验证成功。