首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Reprepro导出找不到签名密钥

Reprepro导出找不到签名密钥
EN

Server Fault用户
提问于 2016-04-13 19:07:41
回答 2查看 8.7K关注 0票数 17

我们有一个私有debian存储库,它是几年前由一个早期的系统管理员建立的。包是由旧密钥7610DDDE (我不得不撤销)签名的,如这里为回购服务器上的根用户所示。

代码语言:javascript
复制
# 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>

下面的所有命令都是根用户。我修改了存储库/conf/分发文件,以使用我为签名而明确创建的新子密钥:

代码语言:javascript
复制
Architectures: i386 amd64 source
Codename: unstable
Components: main
...
SignWith: DD219672

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

代码语言:javascript
复制
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导出时,我得到:

代码语言:javascript
复制
# 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'!

我搜索了几个旧线程,发现reprepro在找到合适的gnupg directory...so时可能会出现问题,我尝试了这一点,并取得了相同的结果:

代码语言:javascript
复制
# GNUPGHOME=/root/.gnupg reprepro -V export unstable

有一个线程建议通过签名一个虚拟文件来测试密钥,这个文件似乎可以工作,至少它没有报告错误,在完成后,我得到了一个576字节的fine...at文件。

代码语言:javascript
复制
# touch bla
# gpg -u DD219672 --sign bla

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

代码语言:javascript
复制
# gpg --list-secret-keys DD219672
sec   4096R/DD219672 2016-04-18
uid                  Archive Maintainer <root@xxxxxxxxxx.com>

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

今天,在更多地阅读和研究手册页并注意到当我运行reprepro时pgp代理自动启动之后,我决定继续进行一段时间。

我添加了一个gpg-agent.conf

代码语言:javascript
复制
debug-level 7
log-file    /root/gpg.agent.log
debug-all

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

代码语言:javascript
复制
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在哪里找到它在HAVKEY中列出的密钥,以及如何将它指向正确的方向,以找到新的密钥,DD219672,以签署我们更新的包。

EN

回答 2

Server Fault用户

回答已采纳

发布于 2016-04-19 13:39:33

我也遇到了同样的问题,在经历了很多挫折之后,我终于找到了正在发生的事情。

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

gpg用于将公钥对保存在两个文件中:pubring.gpgsecring.gpg .随着GnuPG 2.1的改变.为了便于迁移到非安全方法,gpg检测到secring.gpg的存在,并将键动态转换为gpg-agent的密钥存储(这是GnuPG主目录(~/.gnupg)下的private-keys-v1.d目录)。这只做了一次,然后一个现有的secring.gpg不再受到gpg的影响。这允许旧的GnuPG版本与GnuPG 2.1共存。但是,使用新的gpg对私钥的任何更改在使用GnuPG的前2.1版本时都不会出现,反之亦然。

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

对我有效的快速修复:

代码语言:javascript
复制
gpg --export-secret-keys | gpg2 --import -

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

代码语言:javascript
复制
gpg2 --export-secret-keys | gpg --import -

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

在完成上述操作之后,reprepro正确地使用了我的新密钥。

票数 23
EN

Server Fault用户

发布于 2017-08-02 22:16:43

对我来说,问题在于我以用户身份生成密钥,并以root方式运行reprepro。

所发生的事情是,我生成的“没有sudo”的密钥被添加到本地pubring.gpg中。当我运行sudo reprepro ...时,我以根用户的身份运行它,因此它试图在根的pubring.gpg中找到键,但显然找不到。

解决方案是以root方式运行所有gpg命令(eq )。sudo -i,然后gpg --gen-key)。确保在运行sudo gpg --list-keys时,您看到了所需的键和行/root/.gnupg/pubring.gpg

希望这能帮上忙!

票数 3
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/770130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档