签署 Git 提交
通过 GPG 签名保护您的代码提交免受恶意更改。
通常,当人们谈论 GPG 时,他们专注于加密——GPG 保护文件或消息的能力,以便只有拥有适当私钥的人才能读取它。然而,GPG 提供的最重要的功能之一是签名。加密保护文件或消息,以便只有预期的接收者才能解密和读取它,而 GPG 签名证明消息是由发送者(拥有用于签名的私钥的任何人)发送的,并且没有以任何方式从发送者编写的内容更改。
如果没有 GPG 签名,您可能会收到只有您可以打开的加密电子邮件,但您将无法证明它来自发送者。但是,GPG 签名的应用远不止电子邮件。如果您使用现代 Linux 发行版,它会在其所有软件包上使用 GPG 签名,因此您可以确保从发行版安装的任何软件在打包后都没有被篡改以添加恶意代码。一些发行版甚至对其 ISO 安装文件进行 GPG 签名,作为 MD5sum 或 SHA256sum 的更强形式,以验证不仅大型 ISO 下载正确(MD5 或 SHA256 可以做到这一点),而且您从某个随机镜像下载的特定 ISO 与发行版创建的 相同 ISO。镜像可能会更改文件并生成新的 MD5sum,您可能不会注意到,但它无法生成有效的 GPG 签名,因为那将需要访问发行版的签名密钥。
为什么要签署 Git 提交尽管签署软件包和 ISO 非常有用,但 GPG 签名更重要的用途是签署 Git 提交。当您签署 Git 提交时,您可以证明您提交的代码来自您,并且在传输过程中没有被更改。您还可以证明代码是您提交的,而不是其他人。
能够证明是谁编写了代码片段,并不是为了让您知道应该责怪谁的错误,以便该人无法逃脱责任。签署 Git 提交非常重要,因为在这个恶意代码和后门盛行的时代,它有助于保护您免受攻击者的侵害,否则攻击者可能会将恶意代码注入到您的代码库中。它还有助于阻止不值得信任的开发人员向代码中添加自己的后门,因为一旦被发现,不良代码将被追溯到他们。
如何签署 Git 提交签署 Git 提交的最简单方法是将 -S
选项添加到 git commit
命令。首先,使用以下命令找出您的 GPG 密钥 ID
gpg --list-secret-keys --keyid-format LONG
sec# rsa4096/B9EF770D6EFE360F 2019-02-06 [SC]
↪[expires: 2021-02-05]
. . .
在本例中,B9EF770D6EFE360F
是我的长密钥 ID。为什么要使用这个,而不仅仅是与我的密钥关联的电子邮件地址?如果您有多个具有相同 ID 的密钥,您最终可能会使用错误的密钥进行签名。通过指定长密钥 ID,您可以确保每次都使用正确的密钥。
一旦您知道密钥 ID,在您执行 git commit
时将其添加到 -S
选项
git commit -S B9EF770D6EFE360F
现在,当您提交提交时,它将提示您解锁您的 GPG 密钥,以便它可以签署提交。
当然,目标是签署每个提交,如果您每次提交代码都必须添加此参数,那将非常烦人。因此,请将其添加到您的 ~/.gitconfig 中,以便每次都进行签名
[user]
name = Kyle Rankin
email = kyle.rankin@puri.sm
signingkey = B9EF770D6EFE360F
[commit]
gpgsign = true
在您的 .gitconfig 的 [user]
部分中,在您的姓名和电子邮件之后,添加一个 signingkey
选项,并将其设置为您在 git commit
中用于 -S
参数的相同密钥 ID。然后添加一个新的 [commit]
部分(如果它尚不存在),并添加设置为 true
的 gpgsign
选项。这样,您的所有 GPG 提交都将被签名。
一旦完成所有设置的最后一步是,如果您使用基于 Web 的 Git 存储库(如 GitLab 或 GitHub),您需要转到您的共享 Git 存储库,登录您的帐户,并找到允许您上传 GPG 公钥的部分,以便您可以将相应的 GPG 公钥添加到您的帐户。这样,当您签署提交时,Git 存储库将能够根据您的公钥验证签名,并添加一个方便的“已验证”标签,表示提交来自您。