我想使用我的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只使用主密钥进行签名,而不了解子密钥的使用(或者如果我在某个地方把自己搞砸了)?
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签名。[...]
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。