验证没有gpg签名的git提交

8wtpewkr  于 2022-12-25  发布在  Git
关注(0)|答案(3)|浏览(274)

我们开始使用git作为VCS,之前使用的是SVN,发现在git中你可以很容易地辨别出修改和提交背后的真正的人。现在我们想知道为什么选择这个设计,是否有什么我们忽略了的。
让我们假设以下几点:
1.每个人都在gitlab注册了一个ssh密钥
1.提交与gpg签署
1.每个人都可以使用注册的ssh键来使用git bash
我们都知道authorcommitter只是git的元数据,很容易被欺骗,比如:

  1. git config --global --add user.email Incognito@fake.com
  2. git config --global --add user.name "Incognito User"
  3. git commit-m "你不知道我到底是谁"--author ="Max Mustermann"
  4. git推送
    提交的元数据将如下所示:
Author:     Max Mustermann <max.mustermann@company.com>
AuthorDate: Mon Jun 4 13:12:47 2018 +0200
Commit:     Incognito User <Incognito@fake.com>
CommitDate: Mon Jun 4 13:13:26 2018 +0200

现在我认为必须有一种方法来找到提交所用的ssh键真人,因为终端和系统知道键,因此知道提交和推送背后的真人。

    • 问题:**不使用gpg签名,就没有办法找到真实的人吗?

PS:不,我们并不是不信任对方利用这一点,但我们相当好奇,想了解。

ddrv8njm

ddrv8njm1#

  • 更新 * -从torek的评论中复制信息,因为我相信这个上下文足够重要,应该在答案本身中提供,而不仅仅是在评论中:

首先,你需要把 gitgitlab 分开,就 git 而言,ssh只是你连接服务器时可能使用的协议之一,你的ssh密钥或者它的有效性对git来说并不重要;这是你和你的服务器之间的一种连接,服务器会对你进行身份验证,以便决定你是否被授权通过ssh进行连接。
(The服务器可能会执行更细粒度的授权检查,特别是对于 gitlab 这样的主机,它们的全部功能都是与git集成的,尽管如此,这是主机的事情,而不是git的。
像gitlab这样的托管服务可能会选择根据ssh键记录活动,也可能不会,即使它们这样做了,也只能告诉你是谁把提交推送到了服务器上,这可能与提交者或提交者不是同一个人,例如:
假设是爱丽丝写的代码她是作者,她把她的作品副本发给了Bob,Bob把代码放到本地的git repo中,Bob是提交者,Bob创建了一个bundle文件,并把它发给Cindy,现在Cindy把Bob的包含Alice代码的提交加载到她的本地repo中,然后用 * 她的ssh键 * 推送到gitlab,现在git本身并不关心Cindy在其中的角色;她不是提交者,也不是提交者,但是如果gitlab选择记录基于ssh key的提交行为,gitlab可能会记录Cindy将提交引入到服务器。
在git中创建可验证提交的方法是使用签名[1]。所以,“不使用[git记录真实提交人的机制],根本无法找到真实的提交人"。

  • 注意,这源于Git的分布式特性。如果没有某种外部约束,就不可能判断Cindy是否合法地转发了Alice和Bob的工作。使用SVN,有一个明确区分的中心服务器/真相源,Alice必须连接到该服务器创建一个提交,之后Bob必须连接到该服务器。和Cindy必须连接到该服务器。每个人都单独连接到服务器。与SVN不同,Git并不认为这一定会发生。如果你想自己执行这样的策略,你可以让你的服务器来执行。*
  • 托雷克
    [1]虽然我不知道他们的观点是否已经改变,但至少有一些git开发者在早期就表示相信,签署 tags --而不是直接签署commits --是正确的方式。
ggazkfy8

ggazkfy82#

我认为集中式和分布式之间的一个主要区别来自于这样一个事实,即在集中式中,您必须经历一个身份验证过程,以验证“您是您所说的那个人”,以便能够被信任,然后提交或做其他事情。
但是在分布式上,每个人都是他们自己 Realm 的国王/王后。我不需要在我的电脑上对我自己的repo进行认证,对吧?然后记住,即使在分布式VCS上可以做“推”,它实际上是为“拉”而设计的,所以没有人会弄乱我的repo。我从谁那里拉呢?我信任的人,对吧?所以仍然有一些信任,但它是在不同的地方,最终,你是你自己的回购协议的所有者。没有人可以强迫你接受你不喜欢的改变。Linus关于2007年git for google的演讲解释了所有的基础知识。https://www.youtube.com/watch?v=4XpnKHJAok8

uubf1zoe

uubf1zoe3#

首先:自Git 2.19(Q3 2018)起,新的配置变量gpg.format(可以设置为“openpgp“或“x509“)和gpg.<format>.program(用于指定使用什么程序来处理格式)意味着:您可以通过“gpgsm“将x.509证书与CMS一起使用,而不是通过“gnupg“使用openpgp
gpgsm是一个类似于gpg的工具,用于在X. 509证书和**CMS protocol**上提供数字加密和签名服务。
它主要用作S/MIME邮件处理的后端
(The Cryptographic Message Syntax (CMS)是IETF的加密保护消息标准。
它可以被密码方案和协议用来对任何形式的数字数据进行数字签名、摘要、认证或加密。)
所以是的,有一种方法(使用Git)可以找到真实的的人 *,而不使用gpg签名 *。
其次,GitLab 12.8(2020年2月)现在支持“S/MIME提交签名验证
Git仓库中的每一个提交都有一个作者,但这不会被Git验证,这意味着很容易创建看起来像是其他人编写的提交。
提交签名允许您证明您是提交的作者。这对于敏感项目和某些商业环境非常重要。
在Git 2.19中,OpenGPG签名和验证支持被扩展为支持使用X.509证书的S/MIME,因为管理这些证书对于大型组织来说更友好。

GitLab现在也支持提交的S/MIME签名验证,感谢西门子的Roger Meier!更感谢**Henning Schild**,也是西门子的contributing this feature to Git

请参见documentationissue 29782
所以,是的,有一种方法(现在与GitLab集成)可以找到真实的的人 *,而不需要使用gpg签名 *。
自2022年8月起,GitHub also supports SSH commit verification

自2022年12月起,GitLab 15.7,提交signing with SSH is supported

相关问题