Debian

Reprepro 導出找不到簽名密鑰

  • August 2, 2017

我們有一個私有的 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>

以下所有命令均以 root 使用者身份執行。我修改了 repository/conf/distributions 文件以使用我明確創建的新子密鑰進行簽名:

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 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'!

我用Google搜尋了幾個舊執行緒,這些執行緒表明 reprepro 找到正確的 gnupg 目錄可能存在問題……所以我嘗試了這個,結果與上面相同:

# GNUPGHOME=/root/.gnupg reprepro -V export unstable

一個執行緒建議通過簽署一個似乎可以正常工作的虛擬文件來測試密鑰……至少它沒有報告任何錯誤,並且在完成後我得到了一個 576 字節的 bla.gpg 文件。

# touch bla
# gpg -u DD219672 --sign bla

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>

最後,我能夠與首先設置我們的 repro 的系統管理員取得聯繫,他建議嘗試不帶密碼的密鑰。所以我生成了一個新的簽名密鑰,DD219672,發布它,再次執行上述步驟,但結果相同。

今天,在閱讀和研究了更多手冊頁並註意到執行 reprepro 時 pgp-agent 會自動啟動之後,我決定追查一段時間。

我添加了一個 gpg-agent.conf

debug-level 7
log-file    /root/gpg.agent.log
debug-all

我可以在日誌中看到 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]

到目前為止,我一直無法弄清楚 gpg-agent 在哪裡找到它在 HAVKEY 中列出的密鑰,以及如何將它指向正確的方向以找到新密鑰 DD219672,以簽署我們更新的包。

我遇到了同樣的問題,在經歷了很多挫折之後,終於找到了發生的事情。

reprepro工具使用 gpgme,它基於gnupg2. 最近發布的版本改變了密鑰環的處理方式:https ://www.gnupg.org/faq/whats-new-in-2.1.html

gpg 用於將公鑰對保存在兩個文件中:pubring.gpg並且 secring.gpg…在 GnuPG 2.1 中,這發生了變化…為了簡化向無保密方法的遷移,gpg 檢測到 a 的存在 secring.gpg並即時轉換密鑰到 gpg-agent 的密鑰庫(這是private-keys-v1.dGnuPG 主目錄 ( ~/.gnupg) 下面的目錄)。secring.gpg這只完成一次,然後 gpg 不再觸及現有 的。這允許舊 GnuPG 版本與 GnuPG 2.1 共存。但是,在使用 2.1 之前的 GnuPG 版本時,使用新 gpg 對私鑰所做的任何更改都不會顯示,反之亦然。

因此,如果您使用 gpg 創建一個新密鑰,gpg2 將看不到它,反之亦然。

對我有用的快速修復:

gpg --export-secret-keys | gpg2 --import -

如果您需要另闢蹊徑,當然:

gpg2 --export-secret-keys | gpg --import -

根據您的設置,您可能還希望/需要添加--export-secret-subkeys

完成上述操作後,reprepro可以使用我的新密鑰正常工作。

引用自:https://serverfault.com/questions/770130