GnuPG2.1使用了错误的签名子密钥

Cle*_*y94 5 gnupg

所以我在使用gpg2.1签署文档时遇到问题.每当我尝试签名时,我都会:

? dixonwille [~] ? gpg2 --detach-sign Images/EinsteinWP.jpg 
gpg: using "0xEC933DA229123788" as default secret key for signing
gpg: signing failed: No secret key
gpg: signing failed: No secret key
Run Code Online (Sandbox Code Playgroud)

如上面的消息指定我在配置中设置了默认密钥.这是我的私人列表显示的内容:

? dixonwille [~] ? gpg2 -K --with-keygrip
/home/dixonwille/.gnupg/pubring.kbx
-----------------------------------
sec#  rsa4096/0x496AC5165C585343 2017-01-14 [SC]
      Key fingerprint = 2092 7961 2A0C EF20 83D0  8244 496A C516 5C58 5343
      Keygrip = 308FF7DD37FB9E175378D76125FCB2BC4C5C225C
uid                   [ultimate] William E. Dixon <dixonwille@gmail.com>
uid                   [ultimate] William E. Dixon <dixonwille@hotmail.com>
uid                   [ultimate] William E. Dixon <will.dixon@acstechnologies.com>
uid                   [ultimate] [jpeg image of size 5910]
ssb   rsa4096/0xD3522B485A800AFD 2017-01-14 [E] [expires: 2018-01-14]
      Keygrip = 178AB20F816E5FAA31440968AD6EA06B0340FB90
ssb   rsa4096/0xEC933DA229123788 2017-01-14 [S] [expires: 2018-01-14]
      Keygrip = 89A90662E5908D5F271B87A5DC6D26F01B53C9EC
ssb   rsa4096/0xBAA693EC561AD6D9 2017-01-14 [A] [expires: 2018-01-14]
      Keygrip = 9D48688AF67C407BB91900BA07725CCE7E08B546
ssb   rsa4096/0x7A3D17611B1FFDD2 2017-01-14 [S] [expires: 2018-01-14]
      Keygrip = 50EE902E41E323600B02769FA2A96FE8C51D5A35
ssb   rsa4096/0xB64824658CE421C8 2017-01-14 [A] [expires: 2018-01-14]
      Keygrip = D3BD87D77B844A5AE54CEC0466353030A816441B
ssb   rsa4096/0x7642000294227858 2017-01-16 [S] [expires: 2018-01-14]
      Keygrip = B10269A98E3D357F3B32C155367B1CEDCAE998E8
ssb   rsa4096/0x32C4DD59E753B43B 2017-01-16 [A] [expires: 2018-01-14]
      Keygrip = 40E86DAAEDEE6BA714F26B09FBA38C35C4E4F264
Run Code Online (Sandbox Code Playgroud)

现在所有这些密钥都没有私有对手.其中只有三个(0xD3522B485A800AFD,0xEC933DA229123788,0xBAA693EC561AD6D9).为了确保我跑了gpg-connect-agent然后跑keyinfo --list.

? dixonwille [~] ? gpg-connect-agent 
> keyinfo --list
S KEYINFO 178AB20F816E5FAA31440968AD6EA06B0340FB90 D - - - P - - -
S KEYINFO 89A90662E5908D5F271B87A5DC6D26F01B53C9EC D - - - P - - -
S KEYINFO 9D48688AF67C407BB91900BA07725CCE7E08B546 D - - - P - - -
OK
> 
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我的秘密存储在gpg-agent中.运行echo foo | gpg --clearsign -v --debug ipc调试信息显示这些有趣的行:

gpg: DBG: chan_5 -> HAVEKEY 308FF7DD37FB9E175378D76125FCB2BC4C5C225C
gpg: DBG: chan_5 <- ERR 67108881 No secret key <GPG Agent>
gpg: DBG: chan_5 -> HAVEKEY 89A90662E5908D5F271B87A5DC6D26F01B53C9EC
gpg: DBG: chan_5 <- OK
gpg: using "0xEC933DA229123788" as default secret key for signing
gpg: DBG: chan_5 -> HAVEKEY 308FF7DD37FB9E175378D76125FCB2BC4C5C225C 178AB20F816E5FAA31440968AD6EA06B0340FB90 89A90662E5908D5F271B87A5DC6D26F01B53C9EC 9D48688AF67C407BB91900BA07725CCE7E08B546 50EE902E41E323600B02769FA2A96FE8C51D5A35 D3BD87D77B844A5AE54CEC0466353030A816441B B10269A98E3D357F3B32C155367B1CEDCAE998E8 40E86DAAEDEE6BA714F26B09FBA38C35C4E4F264
gpg: DBG: chan_5 <- OK
gpg: using subkey 0x7642000294227858 instead of primary key 0x496AC5165C585343
gpg: writing to stdout
gpg: DBG: chan_5 -> KEYINFO B10269A98E3D357F3B32C155367B1CEDCAE998E8
gpg: DBG: chan_5 <- ERR 67108891 Not found <GPG Agent>
Run Code Online (Sandbox Code Playgroud)

这让我很困惑.它首先检查我的Primary Master密钥是否有秘密,但是找不到它就失败了.然后它检查keygrip的默认密钥,然后说明using "0xEC933DA229123788" as default secret key for signing.那听起来不错.但随后它会发送另一个HAVEKEY看起来像我所有的keygrips.这返回true,因为其中一个确实有秘密.所以它然后说明using subkey 0x7642000294227858 instead of primary key 0x496AC5165C585343我做的最新签名密钥.

如何强制GnuPG2.1使用我在default-key中指定的密钥?看起来好像用GnuPG2.1感觉就好了.

如果我现在没有提及它,那么我知道有人可能会提到松树的答案.如果我运行,ssh git@github.com我会弹出一个对话框来输入我的密钥密码(我使用我的ssh密钥的验证密钥并存储在gpg-agent中).所以我知道我的gpg-agent.conf设置正确,gpg.conf设置正确.

小智 2

在“.gnupg/gpg.conf”中使用以下内容:

default-key 0xEC933DA229123788!
Run Code Online (Sandbox Code Playgroud)

注意“!” 在最后。从 gpg 手册页:

“使用 gpg 时,可能会附加感叹号 (!) 以强制使用指定的主键或辅助键,而不是尝试计算要使用哪个主键或辅助键。”