如何使用现有的SSH密钥对Git提交进行签名

4
根据 Git 的说法,现在你可以使用已有的 SSH 密钥对提交进行签名。

https://github.blog/2021-11-15-highlights-from-git-2-34/#tidbits

以下是翻译:

接下来是:https://unix.stackexchange.com/questions/269188/use-my-ssh-key-to-sign-git-commits

我还在阅读这份文档:https://git-scm.com/docs/git-config#Documentation/git-config.txt-gpgprogram,但它很不清楚如何使用。

我已将我的gpg格式设置为ssh,并将签名设置为true,因此它目前正在尝试签名并失败了。我相信我还需要设置user.signingKey,但我无法弄清楚格式是什么,即git config --global user.signingKey <应该放什么>?

我有一个类似的第二个问题。如果在一年后我格式化我的电脑并且失去了我的密钥,我将没有办法验证那些提交仍然属于我。是否有一个好的标准可以将该密钥保存在其他地方,而不仅仅是将其丢到某个在线驱动器中(我很可能会失去它)?

编辑:我至少成功让gpg工作了。按照Git错误-gpg无法签署数据,我的gpg出现了问题: gpg: 签名失败: 设备不当的 ioctl 操作 gpg: [stdin]: clear-sign 失败: 设备不当的 ioctl 操作 然后从在Maven上使用MacOS的“gpg:签名失败:设备不当的ioctl操作”中添加export GPG_TTY=$(tty)到bash,最终对我有效,至少可以使用gpg签名。
编辑:我以为我已经让它工作了,但没有。按照https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent,我创建了一个新的ed25519 ssh密钥。
之后,您需要运行以下命令:git config --global gpg.format "ssh"git config --global user.signingkey "<key>"
我使用了这个密钥:ssh-ed25519 ASD9s8df79AASDa8sd79as7d9a8s7d89ASDASD98a7sd98a7sdASA/sd user@domain.io,它来自于~/.ssh/id_ed25519.pub
但是当我去Github上查看时:

enter image description here

现在我一点想法都没有了。

SSH签名充满了棘手的细节。即使是GPG签名也会遇到问题,正如您所看到的那样,尽管GPG签名已经得到了长时间的支持,因此人们有更多的时间来找出交互出错的地方。我对让SSH签名工作没有特别的建议。 - torek
是的,正如你所说,让每个棘手部分都正常工作确实令人沮丧。据我所知,Github似乎实际上并不支持SSH签名,或者只支持一种非常特定的SSH格式,或者它只支持RSA,我不确定。最终我只使用了GPG。 - user16435030
请查看我下面编辑过的答案:GitHub现在(2022年8月)支持SSH提交验证。 - VonC
2个回答

6

I: 将gpg格式设置为接受ssh:

git config --global gpg.format ssh

II. 将签名密钥设置为您的ssh密钥公共文件

git config --global user.signingkey /PATH/TO/.SSH/KEY.PUB

完成上述步骤后,转到您的GitHub > 个人资料 > SSH和GPG密钥 > SSH密钥。然后点击添加新的SSH密钥。 确保选择类型为签名密钥,并在框中填入公钥。

如果您有疑问,请通过以下链接进行查看: https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key#:~:text=killall%20gpg%2Dagent-,Telling%20Git%20about%20your%20SSH%20key,-You%20can%20use


6

2022年7月:我在这里介绍了一个新的选项,链接在此

user.signingKey 配置用于 ssh 签名,支持包含密钥的文件路径或者方便起见包含 ssh 公钥的字面字符串。

为了区分这两种情况,我们检查前几个字符是否包含 "ssh::",因为这不太可能是路径的开头。

然而,GitHub 可能尚未识别 SSH 签名。
这在这个帖子中提到,并已添加到github-community/community 讨论 7744中。

2022 年 6 月初,您有:

git does provide direct support for revoking SSH signing keys, beyond the valid-after|before flags mentioned above:

gpg.ssh.revocationFile

Either a SSH KRL or a list of revoked public keys (without the principal prefix).
See ssh-keygen(1) for details.

If a public key is found in this file then it will always be treated as having trust level "never" and signatures will show as invalid.
Hopefully GitHub will surface a similar capability.

David Staheli(GitHub产品经理)回答说:

感谢您提出这些很好的建议。我们可能会发布第一个版本,然后尽快跟进一些这些想法。我会尽快在确定最终范围后分享更多细节。虽然 GitHub 已经可以识别 GPG 密钥是否过期或被吊销,但我要确保我们也支持 SSH 的相同功能,如果v1中没有此功能,我们将尽快推出。


2022年8月更新:

现在支持SSH提交验证

GitHub 现在支持 SSH 提交验证,因此您可以使用自己生成的 SSH 公钥在本地签署提交和标记,以便他人对您所做的更改的来源具有信心。

如果提交或标记具有可加密验证的 SSH 签名,则 GitHub 会将其标记为“已验证”或“部分已验证”。

image-of-verified-commit

如果您已经使用 SSH 密钥进行 GitHub 的身份验证,则现在可以上传相同或不同的密钥并将其用作签名密钥。

您可以向帐户添加任意数量的签名密钥。有关更多信息,请访问GitHub 文档中的 SSH 提交验证

image-of-ssh-signing-key-ui


注意:自2022年12月起,GitLab(15.7)也支持使用SSH签署提交


2
非常感谢您提供如此出色的答案和信息! - user16435030
1
谢谢你提供的所有信息 Von!顺便说一句,对我有效的唯一方法是:git config --global user.signingkey C:\Users\user_name_here\.ssh\id_rsa.pub 这就是我缺少的,现在我的所有提交都已经签名。 - JayRizzo
1
@JayRizzo 很好,干得好! - VonC
数字签名不是基于使用私钥进行签名和使用公钥进行验证吗?为什么git使用公钥进行签名? - undefined
@KevinStallard Git使用私钥进行签名。如果您的配置使用公钥,那么Git将要求提供私钥给ssh-agent。请参阅man页面,以及有关数字签名的详细信息 - undefined

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