使用OpenPGP子密钥签署提交失败。

7

我想使用我的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##############

然而,提交和签名失败,显示如下信息:
> 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
尝试将gpg2设置为gpg.program。由于您使用gpg2运行GnuPG 2.0,因此gpg将是不支持椭圆曲线的GnuPG 1。请注意,目前绝大多数人将无法处理您的签名,因为您的主密钥是椭圆曲线密钥。 - Jens Erat
耶!那就达到目的了!我知道EC25519还不太符合标准,但使用它是一种锻炼,或许在短期内并不是最好的决定。 - THX
2个回答

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

谢谢。使用gpg2也解决了我的RSA密钥问题。git拒绝提交,因为主私钥不存在。 - berbt
这是在使用GnuPG 2.1或更高版本时出现的问题,因为它将私钥移动到公钥环中。早期的GnuPG版本(1.4、2.0)无法在那里找到它。 - Jens Erat

0

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

用于解析GPG输出的代码曾经错误地假定主密钥的指纹对于有效签名始终存在,这已得到纠正。

请查看 提交 67a6ea6(2019年11月22日)和 提交 392b862(2019年11月21日),作者为 Hans Jerry Illikainen (illikainen)
(由Junio C Hamano -- gitster --合并于提交 f06dff7,2019年12月5日)

gpg-interface:限制主密钥指纹的搜索范围

签名者:Hans Jerry Illikainen

GnuPG中使用--status-fd选项的VALIDSIG状态行文档中规定了9个必需字段和1个可选字段。

最后一个可选字段用于指定主密钥的指纹,以防它是由子密钥签名的。

然而,此字段仅适用于OpenPGP签名,而不适用于CMS/X.509。

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

这就是非OpenPGP签名的情况。

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

限制对这9或10个字段的搜索范围,只在单行内进行搜索,以避免此问题。

如果缺少第10个字段,请报告没有主密钥指纹。

文档中写道:

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是主密钥的指纹或与第一个参数相同。

primary-key-fpr参数用于OpenPGP,不适用于CMS签名。[...]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接