我想使用我的一个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只能使用主密钥进行签名但是不理解子密钥的使用(或者如果我在某处搞砸了自己)?
答案 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 67a6ea6的commit 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个字段的搜索限制为一行,以避免出现此问题。
如果缺少第十个字段,请报告没有主键指纹。
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签名。 [...]