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 --list-secret-keys --keyid-format LONG
命令可以列出同时具有公钥和私钥的 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或更高版本,请粘贴以下文本以生成GPG密钥对。
$ gpg --full-generate-key
如果您未使用2.1.17或更高版本,则
gpg --full-generate-key
命令不起作用。 粘贴下面的文本,然后跳到步骤6。$ 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 --list-secret-keys --keyid-format LONG
命令可以列出同时具有公钥和私钥的GPG密钥。 签名提交或标签需要私钥。$ gpg --list-secret-keys --keyid-format LONG <your_email>
用您的邮箱地址替换
<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的公密(将示例30F2B65B9246B6CA替换上一步中的密钥ID):
$ gpg --armor --export 30F2B65B9246B6CA
复制您的GPG密钥的公钥,以
-----BEGIN PGP PUBLIC KEY BLOCK-----
开头并以-----END PGP PUBLIC KEY BLOCK-----
结尾。将GPG密钥的公钥添加到您的Codeup账户。
向您的账户添加GPG密钥
添加密钥后,就无法对其进行编辑,只能将其删除。 如果粘贴无效,则必须删除有问题的密钥并重新添加。
您可以在个人设置(
)的GPG公钥中添加 GPG 密钥的公钥:导航至GPG公钥标签,然后将您的公钥粘贴到公钥输入框中。
最后,单击添加键将其添加到Codeup。 您将能够看到其指纹,相应的邮箱和创建日期。
请确保GPG密钥的邮箱验证通过,若未验证通过,请添加该邮箱到您的个人信息,或使用现有的邮箱生成新的GPG密钥。
将您的GPG密钥与Git关联
如果您使用的GPG密钥与您的提交者身份及与Codeup账户相关联的已验证邮箱地址相符,请告知Git使用哪个密钥。
使用以下命令列出您刚刚创建的私密GPG密钥:
$ gpg --list-secret-keys --keyid-format LONG <your_email>
用您的邮箱地址替换
<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使用该密钥对提交进行签名:
$ git config --global user.signingkey 30F2B65B9246B6CA
用您的GPG密钥ID替换
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:
$ git commit -S30F2B65B9246B6CA -m "My commit msg"
用您的GPG密钥ID替换
30F2B65B9246B6CA
。在询问时输入GPG 密钥的密码(如有)。
推送到Codeup并检查您的提交是否已通过验证。如果您不想在每次提交时都键入-S标志,则可以告诉Git自动签名您的提交:
$ git config --global commit.gpgsign true
对标签签名
除了对提交记录签名外,也可以针对标签进行签名。
您可以通过添加-s 标志来对标签签名:
$ git tag -s mytag
或指定密钥ID。在以下示例中,为30F2B65B9246B6CA:
$ git tag -s -u 30F2B65B9246B6CA mytag
用您的GPG密钥ID替换
30F2B65B9246B6CA
。通过运行git tag -v [tag-name]来验证已签名的标签。
$ 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公钥。
单击要删除的GPG公钥旁边的撤销。
删除GPG密钥
删除密钥不会取消验证已签名的提交或者标签。 使用此密钥验证的提交或者标签将保持验证状态。 删除此密钥后,只有未推送到Codeup的提交才会保持未验证状态。 要取消验证已签名的提交,您需要从账户中撤销关联的GPG密钥。
要从您的账户中删除GPG密钥,请执行以下操作:
在右上角,单击您的头像,然后转到个人设置。
导航到GPG公钥。
单击要删除的GPG公钥旁边的删除。
拒绝未签名的提交或标签(敬请期待)
允许您在仓库的推送规则设置中添加配置,以拒绝未进行GPG签名的提交。
相关资料
Git-工具-签署工作:https://git-scm.com/book/zh/v2/Git-工具-签署工作
GnuPG:https://www.gnupg.org/