使用OpenPGP子项进行签名提交失败

时间:2016-01-13 11:58:05

标签: git gnupg

我想使用我的一个GPS(2)子项在Git中签名提交/标签 即,我新创建的RSA4096仅签名密钥,ID为长#B0 ## ...

sec#  ed25519/9F############## 2016-01-07 [expires: 2023-01-05]
  Key fingerprint = FC08 HEX HEX HEX 
uid                 [ultimate] MY NAME <MY.NAME@foo bar>
ssb   rsa4096/C9############## 2016-01-07 [expires: 2022-01-05]
ssb   ed25519/C6############## 2016-01-07 [expires: 2022-01-05]
ssb   rsa4096/B0############## 2016-01-13 [expires: 2022-01-11]

我正在处理密钥环,其中主密钥已被删除(备份)作为“更好的密钥策略”

所以,我试图为Git设置签名密钥

[user]
    ...
    signingkey = B0##############

然而,承诺&amp;签名失败,

> git commit -S  -m "test commit"
gpg: skipped "B0##############": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

gpg-agent启动并运行的地方。

我的第一个猜测是,Git不理解长按键符号并尝试使用短符号

> gpg2 --list-secret-keys  --keyid-format short
...
ssb   rsa4096/DB###### 2016-01-13 [expires: 2022-01-11]

> ~/.gitconfig
[user]
   ...
   signingkey = DB######

但也失败了

> git commit -S  -m "test commit short"
gpg: skipped "DB######": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

所以,我想知道在这里打破了什么,如果Git只能使用主密钥进行签名但是不理解子密钥的使用(或者如果我在某处搞砸了自己)?

2 个答案:

答案 0 :(得分:15)

Git默认使用gpg,在大多数系统上都是GnuPG 1,不支持椭圆曲线加密。由于您的主键是椭圆曲线键,因此GnuPG 1根本无法使用该键。尝试将密钥与GnuPG(gpg --default-key key-id --sign)一起使用时,您将能够观察到相同的内容。

配置Git代替使用gpg2,这至少需要GnuPG 2.1(你可以使用椭圆曲线键):

git config --global gpg.program gpg2

答案 1 :(得分:0)

最近版本的Git现在默认使用gpg2,但是Git 2.25(2020年第1季度)修复了另一个故障源。

用于解析GPG输出的代码,用于错误地假定主键的指纹始终存在于有效的签名中,该问题已得到纠正。

请参见commit 67a6ea6commit 392b862(2019年11月22日)和Hans Jerry Illikainen (illikainen)(2019年11月21日)。
(由Junio C Hamano -- gitster --commit f06dff7中合并,2019年12月5日)

  

gpg-interface:限制对主键指纹的搜索

     

签名人:Hans Jerry Illikainen

     

GnuPG带有VALIDSIG的{​​{1}}状态行记录为具有9个必填字段和1个可选字段。

     

final(可选)字段用于指定在由子键进行签名的情况下进行签名的主键的指纹。

     

但是,此字段仅适用于OpenPGP签名;不适用于CMS / X.509。

     

如果--status-fd状态行没有可选的第10个字段,则当前代码将继续读取到下一个状态行。

     

非OpenPGP签名就是这种情况。

     

结果是,对于没有实际主键的签名,后续状态行可能被视为“主键”。

     

将对这9个或10个字段的搜索限制为一行,以避免出现此问题。

     

如果缺少第十个字段,请报告没有主键指纹。

     

documentation 说:

     
VALIDSIG
         

args是:

         
        
  • VALIDSIG <args>
  •     
  • <fingerprint_in_hex>
  •     
  • <sig_creation_date>
  •     
  • <sig-timestamp>
  •     
  • <expire-timestamp>
  •     
  • <sig-version>
  •     
  • <reserved>
  •     
  • <pubkey-algo>
  •     
  • <hash-algo>
  •     
  • [<sig-class>]
  •     
         

此状态表示签名在密码上有效。
    [...] <primary-key-fpr>是主键的指纹或与第一个参数相同。

         

PRIMARY-KEY-FPR参数用于OpenPGP,不适用于CMS签名。 [...]