如何使用Python3检查rpm GPG签名?

如何使用Python3检查rpm GPG签名?,python,python-3.x,rpm,artifactory,mirroring,Python,Python 3.x,Rpm,Artifactory,Mirroring,我正在本地Artifactory实例上创建一个本地CentOS镜像,并构建了一个Python3脚本来检查远程和本地repo之间的差异,并相应地更新本地repo 作为一项要求,我需要添加一个步骤,在将下载的rpm包添加到本地镜像之前检查其有效性 虽然我可以通过调用“rpm-K”(在导入CentOS GPG密钥之后)来实现这一点,但我想知道是否有更好的方法来实现这一点,也许不需要依赖外部包 这里是一个简短的shell脚本,它从*.rpm文件中提取“明文”(即有符号的区域)。这是针对报头+有效负载签名

我正在本地Artifactory实例上创建一个本地CentOS镜像,并构建了一个Python3脚本来检查远程和本地repo之间的差异,并相应地更新本地repo

作为一项要求,我需要添加一个步骤,在将下载的rpm包添加到本地镜像之前检查其有效性


虽然我可以通过调用“rpm-K”(在导入CentOS GPG密钥之后)来实现这一点,但我想知道是否有更好的方法来实现这一点,也许不需要依赖外部包

这里是一个简短的shell脚本,它从*.rpm文件中提取“明文”(即有符号的区域)。这是针对报头+有效负载签名的,仅报头签名明文类似,仅报头blob)

您将需要签名(您可以使用rpm python绑定,请参见下面的注释),并且需要将python绑定到gpg以验证包签名

请注意,验证已下载且可能被篡改的包(需要解析以找到明文并检索签名)已经是一项棘手的工作:在验证签名之前,您可能会受到攻击

=====================================/usr/lib/rpm/tgpg

#!/bin/sh

for pkg in $*
do
      if [ "$pkg" = "" -o ! -e "$pkg" ]; then
          echo "no package supplied" 1>&2
          exit 1
      fi

      plaintext=$(mktemp /tmp/tgpg-$$.XXXXXX)
      detached=$(mktemp /tmp/tgpg-$$.XXXXXX)

  # --- Extract detached signature

      rpm -qp -vv --qf '%{siggpg:armor}' $pkg > $detached

  # --- Figger the offset of header+payload in the package

      leadsize=96
      o=$(expr $leadsize + 8)

      set $(od -j $o -N 8 -t u1 $pkg)
      il=$(expr 256 \* \( 256 \* \( 256 \* $2 + $3 \) + $4 \) + $5)
      dl=$(expr 256 \* \( 256 \* \( 256 \* $6 + $7 \) + $8 \) + $9)

      sigsize=$(expr 8 + 16 \* $il + $dl)
      o=$(expr $o + $sigsize + \( 8 - \( $sigsize \% 8 \) \) \% 8)

  # --- Extract header+payload

      dd if=$pkg ibs=$o skip=1 2>/dev/null > $plaintext

  # --- Verify DSA signature using gpg

      gpg --batch -vv --debug 0xfc02 --verify $detached $plaintext

  # --- Clean up

      rm -f $detached $plaintext
  done

谢谢你的回答--rpm命令中的qf相当于--queryformat,对吗?我假设在处理可能被篡改的包时,棘手的部分是使用rpm提取分离的签名。在提取签名时,可以采取哪些措施将安全风险降至最低?我想chroot不会有多大帮助?是的-qf是--queryformat的单破折号别名。更困难的问题是--queryformat函数具有加载的头,并假设可以加载头,以便--queryformat可以检索值。在实践中,您可能很好:同时,在加载头之前,可能存在漏洞利用。chroot可以将损害降至最低,但这不是正确的工程解决方案。为了执行签名验证,您需要3项:1)明文2)签名和3)公钥,可以通过外部方式提供。