欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GPG 签发并验证rpm和yum repo

程序员文章站 2022-07-14 12:45:00
...

https://blog.packagecloud.io/eng/2014/11/24/howto-gpg-sign-verify-rpm-packages-yum-repositories/
本文将展示GPG的签名如何因应用于RPM为文件和YUM仓库的,以及我们如何生成和验证这些签名.
本文还将介绍python库pygpgme,以及我们如何利用它在RPM以及YUM的仓库中验证GPG签名。

问什么需要GPG签名

我们用GPG签名了我们发布的数据,消费者获取到我们的数据,也获取到我们的数据签名,可使用我们的签名验证我们的数据未经人篡改过,是我们提供的原始数据。
RPM包和YUM repo metadata 都可以通过GPG来签名。

Pygpgme

Pygpgme实际上就是打包了GPGME的功能的一个python库,该库可以更直接的使用GPG。
GPGME提供了一些非常便利的接口去获取到GPG key, 加密数据,解密数据等。
YUM是用python开发的,所以,YUM大量使用这个库去验证RPM和YUM repo Metabata中的数字信息。

RPM GPG 签名

RPM文件格式是一种二进制文件格式,其包含:

  • 一个被称为‘lead’的数据结构,但是多数已经被‘header’数据结构所取代
  • 一个包含GPG签名的签名部分,可用于验证这个从创建后并没有被篡改过。
  • 一个头部,包含了一系列索引,用来存储关于RPM包和文件的内部信息
  • CPI0压缩归档后的gzip,包含会被写到文件系统的真实的文件
    一个RPM文件的GPG签名是基于header和CPIO计算生成的,然后存储在签名部分。
    我们可以用rpmsign或者rpm --addsign去签名RPMs。 例如你的有一个rpm为filename.rpm,你的SIGN Key为
Cara Wang <[email protected]>

则你的.rpmacros为

%_gpg_name  Cara Wang <[email protected]>

则我们可以对该rpm包签名

rpm --addsign filename.rpm

RPM Repo metadata GPG 签名

签署repo metadata的目的和我们签署RPM的目的是一样的。经过验证防止篡改。
createrepo在创建repo时,不会自动为repo metadata生成GPG签名,我们可以使用命令为其生成一个分开的GPG签名。
假设我们有一个repo metadata为repomd.xml,则我们可以运行以下指令

gpg --detach-sign --armor repodata/repomd.xml

这个命令会生成一个为‘repodata/repomd.xml.asc’的文件,该文件中包含了一个GPG签名的ASCII版本。
通过repo config的某些选项配置,YUM客户端会主动的请求这个文件并尝试去验证这个签名。

使能RPM和metadata的签名认证

为了能很好的验证GPG keys, 我们必须在客户端做以下几件事

  • 必须安装pygpgme包,这样yum才能验证GPG签名。如果不装这个包,yum会跳过GPG签名的验证。安装这个包,我们需要安装EPEL repo.
    在RHEL6/CentOS6及以后系统,默认pygpgme是和yum一起安装的。
  • YUM repos必须以.repo的文件存在,并且在/etc/yum.repos.d/下,如
    /etc/yum.repos.d/my_stuff.repo
    
  • 在repo文件中,有选择的使能以下选项
    gpgcheck=1 去使能每个RPM文件的GPG验证
    repo_gpgcheck=1 去使能YUM repo metadata的GPG验证
    
    而具体的GPG keys,我们可以直接指定文件或者URL。 如
    gpgkey=https://packagecloud.io/gpg.key
    
    或者
      gpgkey=https://packagecloud.io/gpg.key
           https://some-other-website.com/another_gpg.key
    
    当指定为URL时,YUM客户端会自动下载导入。

总结

生成和验证GPG签名对建立包本身和存储包的repo的认证是很重要的。
确认你要安装的包是供应商提供包,你获取包的仓库是供应商提供的仓库,是保证你安装的包是安全的唯一方法。
给RPM和YUM repo签发GPG和验证GPG不是特别简单,但也并不复杂。尝试签发和验证你的GPG吧。

相关标签: gpg