AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 624888
Accepted
Craig Ringer
Craig Ringer
Asked: 2014-08-29 23:11:01 +0800 CST2014-08-29 23:11:01 +0800 CST 2014-08-29 23:11:01 +0800 CST

我刚刚签署的 RPM 上的签名错误或 NOKEY 错误

  • 772

我在让 RPM 签名为 RHEL / CentOS 5 主机工作时遇到了严重的问题。

TL;DR:RPM 签名不起作用,它以各种疯狂和不稳定的方式工作,具体取决于确切的 GPG 密钥大小和格式,甚至生成位置,当密钥显示rpm -qa gpg-*为存在时会产生 NOKEY 错误;BAD刚刚在同一台机器上使用相同密钥签名的 RPM 上的签名错误;gpg 直接接受密码的密钥上出现无效密码错误;等等


我已经测试了 4096、2048 和 1024 位 RSA 密钥以及 2048 位 DSA 密钥,在同一个 CentOS 5.10 虚拟机上进行签名和验证。行为因密钥类型和大小而异,但我还没有找到任何真正有效的东西。

名称、电子邮件和 RPM 文件名被 XXX 屏蔽但没有其他编辑,例如 DSA 2048 密钥:

$ rpm --version
RPM version 4.4.2.3

$ gpg --list-secret 92fb1e62
sec   2048D/92FB1E62 2014-08-29 [expires: 2015-08-29]
uid                  XXX <[email protected]>
ssb   2048g/2E0F0A24 2014-08-29 [expires: 2015-08-29]

$ gpg -a --export 92fb1e62 > /tmp/packagers

$ sudo rpm --import /tmp/packagers

$ rpm -qa gpg*
gpg-pubkey-92fb1e62-54001945

$ rpmsign --define '%_gpg_name [email protected]' --resign test.el5.x86_64.rpm
Enter pass phrase: 
Pass phrase is good.
test.el5.x86_64.rpm:
gpg: WARNING: standard input reopened
gpg: WARNING: standard input reopened

$ rpm -v -K test.el5.x86_64.rpm
test.el5.x86_64.rpm:
    Header V3 DSA signature: NOKEY, key ID 92fb1e62
    Header SHA1 digest: OK (47271f9fa8ac0ce03b980ff75a37f10d3b78ee7c)
    MD5 digest: OK (f453985ee4331d36cb82d2c4f6009509)
    V3 DSA signature: NOKEY, key ID 92fb1e62

NOKEY? 这有什么意义?

我正常导入了密钥rpm --import。它导入没有错误。它列在 RPM DB 中。然而 RPM 的验证命令没有看到它。

我在 CentOS 5 上看到 4096 位 RSA 密钥存在同样的问题。

(在 Fedora 20 上,它反而失败了:

$ rpmsign --define '%_gpg_name [email protected]' --resign test.x86_64.rpm
Enter pass phrase: 
Pass phrase is good.
test.x86_64.rpm:
error: Unsupported PGP signature

......这至少是在签署时失败,而不是稍后。)

如果我在 CentOS 5 上使用 2048 或 1024 位 RSA 密钥,我会在验证签名时收到错误的签名报告,尽管我只是使用该密钥签署了 RPM:

$ gpg --import /mnt/repo/packaging-key-secret-1024
gpg: key 1FC138CC: secret key imported
gpg: key 1FC138CC: public key "XXX <[email protected]>" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

$ gpg -a --export [email protected] > /tmp/packagers

$ sudo rpm --import /tmp/packagers

$ rpm --define '%_gpg_name [email protected]'  --resign test.x86_64.rpm
Enter pass phrase: 
Pass phrase is good.
test.x86_64.rpm:
gpg: WARNING: standard input reopened
gpg: WARNING: standard input reopened

$ $ rpm -v -K test.x86_64.rpm
test.x86_64.rpm:
Header V3 RSA/SHA1 signature: BAD, key ID 1fc138cc
Header SHA1 digest: OK (1befc128ddd02a79d1b1098bc16aff4532b5af6c)
V3 RSA/SHA1 signature: BAD, key ID 1fc138cc
MD5 digest: OK (2aaacbe1db08a2c63c94f2f705693c7d)

严重地。怎么回事?我正处于沮丧之中,我将自己置于 Stack Exchange 的怜悯之下。RPM 打包者,请分享你的秘密签名巫术。

这似乎与有关 stdin 被重新打开的警告无关。

(我很想不支持 EL5,但我坚持支持它的时间更长,以及更新和更健全的发行版)。

其他相关信息:

$ gpg --version
gpg (GnuPG) 1.4.5
...blahcopyrightblah...
Supported algorithms:
Pubkey: RSA, RSA-E, RSA-S, ELG-E, DSA
Cipher: 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH
Hash: MD5, SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224

$ cat /etc/redhat-release 
CentOS release 5.10 (Final)

哦,为了获得额外的 WTF 积分,我直接在 CentOS 机器上生成了一个一次性的新密钥,密码短语为“fred”。我可以用它签名:

$ gpg -q -a -b --sign -u [email protected] testfile
You need a passphrase to unlock the secret key for
user: "XXX <[email protected]>"
1024-bit DSA key, ID 99188B9C, created 2014-08-29

并验证它:

$ gpg -v testfile.asc 
gpg: armor header: Version: GnuPG v1.4.5 (GNU/Linux)
gpg: assuming signed data in `testfile.asc'
gpg: Signature made Fri 29 Aug 2014 08:02:47 AM UTC using DSA key ID 99188B9C
gpg: Good signature from "XXX <[email protected]>"
gpg: binary signature, digest algorithm SHA1

但是 rpmsign 更加疯狂。使用完全相同的密码短语拒绝它:

$ rpmsign --define '%_gpg_name [email protected]'  --resign test.el5.x86_64.rpm
Enter pass phrase: 
Pass phrase check failed

无论是打字还是复制粘贴。rpm用作包装器而不是直接使用rpmsign没有区别。

更新:对于新的奖励疯狂点,在 CentOS 6.5 上使用 2048 位 DSA 密钥,使用test.rpm刚刚mock在 CentOS 6.5 目标模拟环境中编译的(即具有匹配的 RPM 版本):

$ rpmsign --define '%_gpg_name 92FB1E62' --resign test.rpm
Enter pass phrase: 
Pass phrase is good.
test.rpm:

$ rpm -v -K test.rpm 
error: skipping package test.rpm with unverifiable V4 signature

是的 - rpmsign 只是对包进行了签名,然后拒绝了它自己的签名。

显然大多数人没有这些问题。我错过了什么?

redhat
  • 1 1 个回答
  • 16290 Views

1 个回答

  • Voted
  1. Best Answer
    Craig Ringer
    2014-08-30T01:06:56+08:002014-08-30T01:06:56+08:00

    这是一组 RPM 错误。不只是一个错误,或两个错误。小动物的巢穴。RPM 验证签名包失败(失败?),不理解 v4 GPG 签名,但没有注意到它不理解它们,不理解某些密钥大小和类型,但没有注意到它不理解,并且还被子键噎住了!

    正如一位同事所指出的,Jacob Helwig 的这篇救生博客文章涵盖了以下问题:

    您必须强制 GnuPG 在您的 `

    %__gpg_sign_cmd %{__gpg} \
        gpg --force-v3-sigs --digest-algo=sha1 --batch --no-verbose --no-armor \
        --passphrase-fd 3 --no-secmem-warning -u "%{_gpg_name}" \
        -sbo %{__signature_filename} %{__plaintext_filename}
    

    因为 RPM 在签名后不会检查 sigversion 或验证签名包,并且这些发行版包含默认为 v4 签名的 GPG 版本。

    您还必须生成不带子密钥的 2048 位仅签名 RSA 密钥。

    几个相关的错误:

    • RPM 似乎无法找到 (GPG) 用于验证签名的 RSA 密钥

    • rpm --sign 使用 4096 位或 2048 位 RSA 密钥创建损坏的签名

    • 8

相关问题

  • 如何设置 Redhat 对 ActiveDirectory 的用户进行身份验证

  • 如何从 RHEL 5 迁移到 CentOS 5?

  • 我应该将 Rails 应用程序部署到哪个目录?

  • 如何移动 MySQL 的数据目录?

  • RHEL 5.3 上可用的 yum 存储库

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve