如何使用 Python3 检查 rpm GPG 签名?
How to check rpm GPG signature using Python3?
我正在本地 Artifactory 实例上创建本地 CentOS 镜像,我构建了一个 Python3 脚本来检查远程和本地存储库之间的差异并相应地更新本地存储库。
作为需求,我需要添加一个步骤,在将它们添加到本地镜像之前检查下载的 rpm 包的有效性。
虽然我可以通过调用 "rpm -K" 来做到这一点(在导入 CentOS GPG 密钥之后),但我想知道是否有更好的方法来实现它,也许不依赖外部包。
这是一个简短的 shell 脚本,它从 *.rpm 文件中提取 "plaintext"(即已签名的区域)。这是header+payload签名,header-only签名明文类似,只是header 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 \* + \) + \) + )
dl=$(expr 256 \* \( 256 \* \( 256 \* + \) + \) + )
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
我正在本地 Artifactory 实例上创建本地 CentOS 镜像,我构建了一个 Python3 脚本来检查远程和本地存储库之间的差异并相应地更新本地存储库。
作为需求,我需要添加一个步骤,在将它们添加到本地镜像之前检查下载的 rpm 包的有效性。
虽然我可以通过调用 "rpm -K" 来做到这一点(在导入 CentOS GPG 密钥之后),但我想知道是否有更好的方法来实现它,也许不依赖外部包。
这是一个简短的 shell 脚本,它从 *.rpm 文件中提取 "plaintext"(即已签名的区域)。这是header+payload签名,header-only签名明文类似,只是header 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 \* + \) + \) + )
dl=$(expr 256 \* \( 256 \* \( 256 \* + \) + \) + )
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