当前位置: 首页 > 知识库问答 >
问题:

使用OpenPGP子密钥签名提交失败

邴墨竹
2023-03-14

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

然而,promise

> 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代理启动并运行。

我的第一个猜测是,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个答案

寇景明
2023-03-14

Git的最新版本现在默认使用gpg2,但是Git 2.25(Q1 2020)修复了另一个失败源。

解析GPG输出的代码用于错误地假设主键的finterprint将始终存在于有效签名中,该签名已被更正。

参见Hans-Jerry Illikainen的提交67a6ea6(2019年11月22日)和提交392b862(2019年11月21日)(Illikainen
(由Junio C Hamano--gitster于2019年12月5日在提交f06dff7中合并)

签署人:汉斯·杰里·伊里凯宁

GnuPG中的VALIDSIG状态行带有--states-fd,被记录为有9个必需字段和1个可选字段。

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

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

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

这就是非OpenPGP签名的情况。

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

将这9个或10个字段的搜索限制在单行,以避免此问题。

如果第10个字段丢失,报告没有主键指纹。

文件说:

VALIDSIG <args>

这些参数是:

此状态表示签名在加密方面有效
[…]PRIMARY-KEY-FPR是主键的指纹或与第一个参数相同。

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

夏弘文
2023-03-14

Git默认使用gpg,在大多数系统上是GnuPG 1,不支持椭圆曲线加密。由于您的主键是椭圆曲线键,GnuPG 1根本无法使用该键。当您尝试使用GnuPG键时,您将能够观察到相同的情况(gpg--default-key key-id--mark)。

将Git配置为使用gpg2,它至少需要为gnupg2.1(您可以使用椭圆曲线键,因此您拥有):

git config --global gpg.program gpg2
 类似资料:
  • 我在尝试使用Git提交时遇到此错误。 我已经生成了一个新的密钥,如下所示,但它仍然给出相同的错误 密钥与上述相同 我发现这会生成一个用于git标记的GPG密钥,并按照步骤进行操作,但仍然不起作用,知道吗?

  • Git 签名 Tags 和 commits 都可以通过 Yubikey GPG 钥匙来进行签名。

  • 这可能吗?如何从命令行执行此操作?

  • 有没有一种简单的方法可以让Git总是在创建的每个提交或标记上签名? 我试过这样的方法: 但这并没有成功。 我不想安装不同的程序来实现这一点。它容易做到吗? 只是一个附带的问题,也许提交不应该被签名,只有标签,我从来没有创建过,因为我为一个项目提交了单个提交,比如Homebrew,等等。

  • 我得到了签名列表,当我试图获取签名者的用户ID时,没有返回任何内容。 所以我的疑问是OpenPGP签名是否包含签名者的用户ID。 我使用Thunderbird查看签名,但它也显示未找到用于签名的用户ID,并且当我导入与我签名的私钥对应的公钥时,它显示签名者的用户ID。