我们有一个私人的debian存储库,几年前由一个早期的系统pipe理员build立。 软件包由旧密钥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) <[email protected]> pub 1024D/7610DDDE 2006-03-03 [revoked: 2016-03-31] uid Archive Maintainer <[email protected]> pub 4096R/DD219672 2016-04-18 uid Archive Maintainer <[email protected]>
以下所有命令均以root用户身份进行。 我修改了repository / conf / distributions文件来使用我明确创build的新的子密钥来签名:
Architectures: i386 amd64 source Codename: unstable Components: main ... SignWith: DD219672
但是当我使用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)
而当我直接运行reprepro出口时,我得到:
# 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'!
我谷歌search,并发现了一些旧的线程,表明find正确的gnupg目录remapro可能的问题…所以我试着这与上面的相同的结果:
# GNUPGHOME=/root/.gnupg reprepro -V export unstable
一个线程build议通过签署一个似乎工作正常的虚拟文件来testing密钥……至less它没有报告错误,并且在完成之后我最终得到了一个576字节的bla.gpg文件。
# touch bla # gpg -u DD219672 --sign bla
代表手册页面还build议“如果签名有问题,可以尝试使用gpg –list-secret-keys值来查看gpg如何解释该值。如果该命令没有列出任何键或多个键,请尝试查找一些其他的价值(如keyid),gpg可以更容易地与一个唯一的关键。“ 所以我也检查了,得到:
# gpg --list-secret-keys DD219672 sec 4096R/DD219672 2016-04-18 uid Archive Maintainer <[email protected]>
最后,我能够与首先设置repros的系统pipe理员取得联系,他build议在没有密码的情况下尝试一个密钥。 于是我生成了一个新的签名密钥DD219672,发布了它,再次经过上面的步骤,但是结果一样。
今天,经过更多的阅读和学习手册页,并注意到pgp-agent在运行reprepro时自动启动,我决定追赶一段时间。
我加了一个gpg-agent.conf
debug-level 7 log-file /root/gpg.agent.log debug-all
我可以在日志中看到gpg-agent没有find密钥
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]
我到目前为止一直无法弄清楚gpg-agent在哪里find它在HAVKEY中列出的密钥,以及如何指向正确的方向来find新的密钥DD219672来签署我们更新的软件包。
我遇到了同样的问题,经历了很多挫折,终于find了原因。
reprepro工具使用基于gnupg2 。 最近的一个版本改变了密钥环的处理方式: https : //www.gnupg.org/faq/whats-new-in-2.1.html
gpg用于保持公钥对的两个文件:
pubring.gpg和secring.gpg…随着GnuPG 2.1这个改变…为了方便迁移到不secring.gpg方法,gpg检测到存在一个secring.gpg并将密钥即时转换为gpg-agent密钥存储区(这是GnuPG主目录(~/.gnupg)下面的private-keys-v1.d目录)。 这只做了一次,现在secring.gpg不再被gpg所触及。 这可以让旧的GnuPG版本与GnuPG 2.1共存。 但是,当使用GnuPG之前的版本时,使用新gpg的私钥的任何改变都不会显示,反之亦然。
因此,如果你用gpg创build一个新的密钥,gpg2将不会看到它,反之亦然。
快速修复,为我工作:
gpg --export-secret-keys | gpg2 --import -
当然,如果你需要走另一条路:
gpg2 --export-secret-keys | gpg --import -
根据您的设置,您可能还需要/需要添加 – --export-secret-subkeys
完成上述步骤之后, reprepro正确地使用了我的新密钥。
对我来说,问题是我作为用户生成密钥,并以root 身份 运行reprepro 。
发生了什么事是我生成的“没有sudo ”的键被添加到我的本地pubring.gpg 。 当我运行sudo reprepro ...我作为根运行它,因此它试图findroot的pubring.gpg密钥,显然没有find一个。
解决方法是以root身份运行所有gpg命令(例如sudo -i ,然后使用gpg --gen-key )。 确保当你运行sudo gpg --list-keys你会看到你想要的键和/root/.gnupg/pubring.gpg行。
希望有所帮助!