Git 虽然是密码级安全的,但并不是万无一失的。当有人的用户密码泄露,或者有人想恶意伪造他人的提交,就有可能冒名您信任的人,向您的代码仓库提交恶意代码。您可以使用GPG 在本地签署提交记录(commit)或者标签(tag)。 Codeup 将对这些签名做验证,来确保提交记录或者标签来自受信任的来源。
Codeup 如何处理 GPG 签名
Codeup 使用自己的钥匙链来验证GPG签名,它不访问任何公钥服务器。
对于要由 Codeup 验证的提交:
-
提交者必须具有 GPG 公钥/私钥对。
-
提交者的公钥必须已上传到其 Codeup 账户。
-
GPG密钥必须包含电子邮箱,并且邮箱必须与提交者在Codeup中使用的经过验证的邮箱地址匹配。
-
提交记录提交者(committer)的邮箱地址必须与GPG 密钥中验证的邮箱地址匹配。
GPG 密钥
安装GPG工具
默认情况下,macOS或Windows上未安装GPG。 要安装GPG命令行工具,请参见GnuPG的下载页面。
查看已存在的密钥对
在生成新的密钥对之前,可以先检查是否有已存在的密钥对, 如果尝试添加使用不受支持的算法生成的密钥,则可能会遇到错误。Codeup目前支持几种GPG密钥算法:
-
RSA
-
ElGamal
-
DSA
-
打开终端(macOS或Linux用户) / git bash(Windows用户)。
-
使用以下命令可列出同时具有公钥和私钥的 GPG 密钥。签名提交或标签需要私钥。
gpg --list-secret-keys --keyid-format LONG -
检查命令输出以查看是否具有GPG密钥对。
-
如果没有GPG密钥对,或者您不想使用任何已有的密钥来签署提交和标签,则生成一个新的GPG密钥对。
-
如果已经存在一个GPG密钥对,并且您想使用它来签署提交和标签,则将GPG公钥添加到Codeup账户中。
-
生成GPG密钥对
如果您没有现成的GPG密钥对,则可以生成一个新的GPG密钥用于签署提交和标签。如果您的操作系统已安装gpg2,请在以下命令中将gpg替换为gpg2。
-
打开终端(macOS或Linux用户) / git bash(Windows用户)。根据您的
gpg版本,选择执行以下命令。由于GPG有多个版本,因此您可能需要查阅相关的手册页以找到适当的密钥生成命令,您的密钥必须使用RSA。
2.1.17或更高版本如果您使用的是
2.1.17或更高版本,请执行以下命令生成GPG密钥对。gpg --full-generate-key2.1.17以下版本如果您使用的是
2.1.17以下版本,需执行以下命令,然后跳到步骤 4。gpg --default-new-key-algo rsa4096 --gen-key -
在提示符下,指定所需的密钥类型,或按
Enter键接受默认的RSA and RSA。Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1 -
输入所需的密钥大小,您的密钥必须至少为
4096位。RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits -
输入密钥有效的时间长度,按
Enter键指定默认选择,表示该密钥不会过期。Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 0 Key does not expire at all -
确认您的选择是否正确。
Is this correct? (y/N) y -
输入您的姓名(或昵称),与此密钥关联的邮箱地址(应与您在Codeup中使用的已验证邮箱地址匹配)和可选注释(按
Enter跳过)。GnuPG needs to construct a user ID to identify your key. Real name: Codeup Email address: <your_email> Comment: You selected this USER-ID: "Codeup <your_email>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O -
根据提示输入一个强密码来保护你的 GPG 密钥,并进行二次确认。至此,已生成GPG密钥对。
导出GPG公钥
-
使用以下命令可以列出同时具有公钥和私钥的GPG密钥。 签名提交或标签需要私钥。
注意:用您的邮箱地址替换
<your_email>。gpg --list-secret-keys --keyid-format LONG <your_email> -
复制以
sec开头的GPG密钥ID。 在以下示例中,为30F2B65B9246B6CA。sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC] D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA uid [ultimate] Codeup <your_email> ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E] -
执行以下命令导出该ID的公钥。GPG密钥的公钥以
-----BEGIN PGP PUBLIC KEY BLOCK-----开头并以-----END PGP PUBLIC KEY BLOCK-----结尾。注意:将示例中
30F2B65B9246B6CA替换上一步中的密钥ID。gpg --armor --export 30F2B65B9246B6CA
向您的账户添加GPG密钥
添加密钥后,就无法对其进行编辑,只能将其删除。 如果粘贴无效,则必须删除有问题的密钥并重新添加。
将您的GPG密钥与Git关联
如果您使用的GPG密钥与您的提交者身份及与Codeup账户相关联的已验证邮箱地址相符,请告知Git使用哪个密钥。
-
使用以下命令列出您的GPG密钥。
注意:用您的邮箱地址替换
<your_email>。gpg --list-secret-keys --keyid-format LONG <your_email> -
复制以sec开头的GPG密钥ID。 在以下示例中,为30F2B65B9246B6CA。
sec rsa4096/30F2B65B9246B6CA 2017-08-18 [SC] D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA uid [ultimate] Codeup <your_email> ssb rsa4096/B7ABC0813E4028C0 2017-08-18 [E] -
告诉Git使用该密钥对提交进行签名。
注意:用您的GPG密钥ID替换
30F2B65B9246B6CA。git config --global user.signingkey 30F2B65B9246B6CA通过
--global设置的GPG密钥会作为您的默认密钥,若您希望针对某些仓库使用其他的密钥时,可在对应的仓库下,单独设置,如:git config user.signingkey 30F2B65B9246B6CA -
(可选)如果Git使用的是
gpg,并且出现诸如secret key not available或gpg: signing failed: secret key not available的错误,请运行以下命令更改为gpg2。git config --global gpg.program gpg2
签名
对提交记录签名
创建GPG密钥并将其添加到您的账户之后,您可以开始对提交进行签名。
-
您可以像以前一样提交,唯一的区别是添加了
-S标志。git commit -S -m "My commit msg"或指定密钥ID,如:30F2B65B9246B6CA。
注意:用您的GPG密钥ID替换
30F2B65B9246B6CA。git commit -S30F2B65B9246B6CA -m "My commit msg" -
在询问时输入GPG 密钥的密码(如有)。
-
推送到Codeup并检查您的提交是否已通过验证。如果您不想在每次提交时都键入-S标志,则可以告诉Git自动签名您的提交。
git config --global commit.gpgsign true
对标签签名
除了对提交记录签名外,也可以针对标签进行签名。
-
您可以通过添加
-s标志来对标签签名。git tag -s mytag或指定密钥ID。如:30F2B65B9246B6CA。
注意:用您的GPG密钥ID替换
30F2B65B9246B6CA。git tag -s -u 30F2B65B9246B6CA mytag -
执行以下命令验证已签名的标签。
git tag -v mytag
如果您不想在每次创建标签时都键入-s标志,则可以告诉Git自动签名您的提交。
git config --global tag.gpgSign true
签名验证
签名验证状态包括两种:
-
验证通过。
-
验证不通过。
当显示验证不通过时,可能为以下几种原因之一:
-
GPG公钥验签未通过。
-
GPG公钥验签通过,提交者邮箱(committer email)属于当前云效用户,但与证书邮箱不一致。
-
GPG公钥验签通过,但提交者邮箱(committer email)与证书邮箱不一致。
-
GPG公钥验签通过,但证书邮箱不属于当前云效用户已绑定的邮箱。
-
GPG公钥未注册到Codeup。
GPG密钥移除
撤销GPG密钥
撤销密钥将取消已签名的提交记录及标签的验证。 使用此密钥验证的提交将变为未验证状态。 撤销此密钥后,将来的提交也将保持不变。如果您的密钥已被盗用,则应使用此操作。
-
登录云效 工作台,单击右上角个人头像,并在弹出的菜单中单击个人设置。
-
在个人设置页面,单击GPG 公钥。
-
鼠标移动到已有公钥上面。单击撤销并在弹出的对话框中单击确定。
撤销后将无法使用该公钥进行提交签名验证,已验证的提交将变为未验证状态。
删除GPG密钥
删除密钥不会取消验证已签名的提交或者标签。 使用此密钥验证的提交或者标签将保持验证状态。 删除此密钥后,只有未推送到Codeup的提交才会保持未验证状态。 要取消验证已签名的提交,您需要从账户中撤销关联的GPG密钥。
-
登录云效 工作台,单击右上角个人头像,并在弹出的菜单中单击个人设置。
-
在个人设置页面,单击GPG 公钥。
-
鼠标移动到已有公钥上面。单击删除并在弹出的对话框中单击确定。
删除后将无法使用该公钥进行提交签名验证,已验证的提交不受影响。
拒绝未签名的提交或标签(敬请期待)
您可以在仓库的推送规则中配置,拒绝未进行GPG签名的提交。
相关资料
-
Git-工具-签署工作:https://git-scm.com/book/zh/v2/Git-工具-签署工作。
-
GnuPG:https://www.gnupg.org/