带有签名的 git 中的可信开发路径
-
19-09-2019 - |
题
我想为软件开发建立一条可信的道路。这意味着在被接受之前,必须由作者和一名审阅者签署对代码的每次更改。这些更改的签名必须在发布时间进行验证,否则必须有其他一些方法来确保存储库不得不被篡改或添加其他更改。
我期望将其用于此的版本控制系统是Git,但也接受了其他选项。签名可以通过GNUPG或SSL证书。
我认为的工作流程大致是:
- 当前验证的主干已分支
- 更改是由一名或多名开发人员在分支中开发的
- 一名或多名开发人员签署分支所做的更改
- 审阅者审阅并测试更改
- 审阅者签署分支所做的更改
- 分支被“合并”到当前经过验证的主干中
合并不必是万无一失的,例如未经审查的更改将不可能无能为力 - 只是在释放之前,需要一种方法来检查是否有任何未经浏览的(未签名)的行李箱更改。一般来说,不需要防止篡改,只需检测即可。
我想要一份关于如何设置以及如何完成每个操作的简短指南。一旦我得到一些指示,我就可以自己弄清楚具体细节。
另外,我已经在技术上了解“git tag -s”,但我不确定如何将其应用于这个特定问题。
解决方案
在您标记之前,更改不会被签名。在此之前的任何内容都可以由作者或其他带外机制验证,但不能从 git 内部验证。
git 可以验证更改的继承是否正确,但只有签名标签才能验证更改本身是否正确。
对于您的工作流程,您可能会发现自己标记了很多。
其他提示
您可以使用标签中的 -s 选项使用 GPG 密钥对标签进行签名 git tag -s v0.1.0
:
-s
Make a GPG-signed tag, using the default e-mail address's key
但你不能签署承诺。
Git 是一个很好的候选者,因为:
- 每个提交都已签名
- 每次提交的 SHA1 密钥足以确保 全部 回购协议尚未修改
- git tag -s 可用于签署某人未做出的提交(
git tag -m
更明确)
所以:
- 当前验证的主干已分支
git checkout -b tag_for_last_verified_trunk_content test # branch test
- 更改是由一名或多名开发人员在分支中开发的
[work...] git commit -s -m "dev1 comment" ...
一名或多名开发人员签署分支所做的更改
通过在提交消息末尾添加签名行,已完成提交:请参阅此页面 关于签字的解释 过程。
Signed-off-by: user name
审阅者审阅并测试更改
git tag -m "testing" testing # refer to current commit, allowing dev to go on with further changes
- 审阅者签署分支所做的更改
git tag -m "tested" tested testing # put a tag on the same SHA1 than the "testing" tag
- 分支被“合并”到当前经过验证的主干中
git checkout trunk & git merge tested
西里尔·普洛特尼基-丘迪克 提及 在评论中 从 git 1.7.9(2012 年 1 月,这个答案差不多 2 年后)开始,你可以使用 GPG 签署你想要的任何提交 git commit -S
.
(看 提交 ba3c69a9, ,最近在 提交 df45cb3)