Reprepro 导出找不到签名密钥

And*_*man 16 debian gpg repository

我们有一个私有的 debian 存储库,它是由早期的系统管理员在几年前建立的。软件包由旧密钥 7610DDDE(我必须撤销)签名,如 repo 服务器上的 root 用户所示。

# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   1024D/2D230C5F 2006-01-03 [expired: 2007-02-07]
uid                  Debian Archive Automatic Signing Key (2006)  <ftpmaster@debian.org>

pub   1024D/7610DDDE 2006-03-03 [revoked: 2016-03-31]
uid                  Archive Maintainer <root@xxxxxxxxxx.com>

pub   4096R/DD219672 2016-04-18
uid                  Archive Maintainer <root@xxxxxxxxxx.com>
Run Code Online (Sandbox Code Playgroud)

以下所有命令均以 root 用户身份执行。我修改了 repository/conf/distributions 文件以使用我明确创建的新子密钥进行签名:

Architectures: i386 amd64 source
Codename: unstable
Components: main
...
SignWith: DD219672
Run Code Online (Sandbox Code Playgroud)

但是当我使用 dput 更新包时,我得到

Could not find any key matching 'DD219672'!
ERROR: Could not finish exporting 'unstable'!
This means that from outside your repository will still look like before (and
should still work if this old state worked), but the changes intended with this
call will not be visible until you call export directly (via reprepro export)
Run Code Online (Sandbox Code Playgroud)

当我直接运行 reprepro export 时,我得到:

# reprepro -V export unstable
Exporting unstable...
 generating main/Contents-i386...
 generating main/Contents-amd64...
Could not find any key matching 'DD219672'!
ERROR: Could not finish exporting 'unstable'!
Run Code Online (Sandbox Code Playgroud)

我在谷歌上搜索并发现了几个旧线程,这些线程表明 reprepro 找到正确的 gnupg 目录可能存在问题......所以我尝试了与上述相同的结果:

# GNUPGHOME=/root/.gnupg reprepro -V export unstable
Run Code Online (Sandbox Code Playgroud)

一个线程建议通过签署一个似乎工作正常的虚拟文件来测试密钥……至少它没有报告错误,并且在完成后我最终得到了一个 576 字节的 bla.gpg 文件。

# touch bla
# gpg -u DD219672 --sign bla
Run Code Online (Sandbox Code Playgroud)

reprepro 手册页还建议“如果签名有问题,您可以尝试gpg --list-secret-keys value以查看 gpg 如何解释该值。如果该命令未列出任何键或多个键,请尝试查找其他一些值(如 keyid),gpg 可以更容易地与唯一键关联。” 所以我也检查了一下,得到:

# gpg --list-secret-keys DD219672
sec   4096R/DD219672 2016-04-18
uid                  Archive Maintainer <root@xxxxxxxxxx.com>
Run Code Online (Sandbox Code Playgroud)

最后,我能够与首先设置我们的重现的系统管理员取得联系,他建议尝试一个没有密码短语的密钥。所以我生成了一个新的签名密钥,DD219672,发布了它,再次执行上述步骤,但结果相同。

今天,经过更多的阅读和研究手册页并注意到当我运行 reprepro 时 pgp-agent 会自动启动,我决定继续研究一段时间。

我添加了一个 gpg-agent.conf

debug-level 7
log-file    /root/gpg.agent.log
debug-all
Run Code Online (Sandbox Code Playgroud)

我可以在日志中看到 gpg-agent 没有找到密钥

2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK Pleased to meet you, process 18903
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- RESET
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION ttyname=/dev/pts/0
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION ttytype=xterm-256color
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- GETINFO version
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> D 2.1.11
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION allow-pinentry-notify
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- OPTION agent-awareness=2.1.0
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> OK
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- AGENT_ID
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> ERR 67109139 Unknown IPC command <GPG Agent>
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- HAVEKEY C2C5C59E5E90830F314ABB66997CCFAACC5DEA2F 416E8A33354912FF4843D52AAAD43FBF206252D9 8CE77065EA6F3818A4975072C8341F32CB7B0EF0
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 -> ERR 67108881 No secret key <GPG Agent>
2016-04-18 15:54:00 gpg-agent[15582] DBG: chan_5 <- [eof]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我一直无法弄清楚 gpg-agent 在哪里找到它在 HAVKEY 中列出的密钥,以及如何将其指向正确的方向以找到新密钥 DD219672,以对我们更新的软件包进行签名。

小智 22

我遇到了同样的问题,经过多次挫折,终于找到了发生了什么。

reprepro工具使用 gpgme,它基于gnupg2. 最近发布的版本改变了密钥环的处理方式:https : //www.gnupg.org/faq/whats-new-in-2.1.html

gpg 用于将公钥对保存在两个文件中:pubring.gpgsecring.gpg... 在 GnuPG 2.1 中,这改变了 ... 为了简化向无保密方法的迁移,gpg 检测 a 的存在 secring.gpg并即时转换密钥到 gpg-agent 的密钥库(这是private-keys-v1.dGnuPG 主目录 ( ~/.gnupg)下的目录)。这只完成一次,secring.gpg然后gpg不再触及现有的 。这允许较旧的 GnuPG 版本与 GnuPG 2.1 共存。但是,使用新 gpg 对私钥的任何更改在使用 2.1 之前的 GnuPG 版本时都不会显示,反之亦然。

因此,如果您使用 gpg 创建一个新密钥,gpg2 将看不到它,反之亦然。

对我有用的快速修复:

gpg --export-secret-keys | gpg2 --import -
Run Code Online (Sandbox Code Playgroud)

如果你需要走另一条路,当然:

gpg2 --export-secret-keys | gpg --import -
Run Code Online (Sandbox Code Playgroud)

根据您的设置,您可能还想/需要添加 --export-secret-subkeys

完成上述操作后,reprepro我的新密钥正常工作。

  • 伙计,你应该获得一枚奖章来追踪它。 (2认同)