GPG 签名杜绝提交伪造

Git 虽然是密码级安全的,但并不是万无一失的。当有人的用户密码泄露,或者有人想恶意伪造他人的提交,就有可能冒名您信任的人,向您的代码仓库提交恶意代码。您可以使用GPG 在本地签署提交记录(commit)或者标签(tag)。 Codeup 将对这些签名做验证,来确保提交记录或者标签来自受信任的来源。

Codeup 如何处理 GPG 签名

Codeup 使用自己的钥匙链来验证GPG签名,它不访问任何公钥服务器。

对于要由 Codeup 验证的提交:

  • 提交者必须具有 GPG 公钥/私钥对。

  • 提交者的公钥必须已上传到其 Codeup 账户。

  • GPG密钥必须包含电子邮箱,并且邮箱必须与提交者在Codeup使用的经过验证的邮箱地址匹配。

  • 提交记录提交者(committer)的邮箱地址必须与GPG 密钥中验证的邮箱地址匹配。

GPG 密钥

安装GPG工具

默认情况下,macOSWindows上未安装GPG。 要安装GPG命令行工具,请参见GnuPG下载页面

查看已存在的密钥对

在生成新的密钥对之前,可以先检查是否有已存在的密钥对, 如果尝试添加使用不受支持的算法生成的密钥,则可能会遇到错误。Codeup目前支持几种GPG密钥算法:

  • RSA

  • ElGamal

  • DSA

  1. 打开终端(macOSLinux用户) / git bash(Windows用户)。

  2. 使用以下命令可列出同时具有公钥和私钥的 GPG 密钥。签名提交或标签需要私钥。

    gpg --list-secret-keys --keyid-format LONG
  3. 检查命令输出以查看是否具有GPG密钥对。

    • 如果没有GPG密钥对,或者您不想使用任何已有的密钥来签署提交和标签,则生成一个新的GPG密钥对。

    • 如果已经存在一个GPG密钥对,并且您想使用它来签署提交和标签,则将GPG公钥添加到Codeup账户中。

生成GPG密钥对

如果您没有现成的GPG密钥对,则可以生成一个新的GPG密钥用于签署提交和标签。如果您的操作系统已安装gpg2,请在以下命令中将gpg替换为gpg2

  1. 打开终端(macOSLinux用户) / git bash(Windows用户)。根据您的 gpg 版本,选择执行以下命令。

    由于GPG有多个版本,因此您可能需要查阅相关的手册页以找到适当的密钥生成命令,您的密钥必须使用RSA。

    2.1.17或更高版本

    如果您使用的是2.1.17或更高版本,请执行以下命令生成GPG密钥对。

    gpg --full-generate-key

    2.1.17以下版本

    如果您使用的是2.1.17以下版本,需执行以下命令,然后跳到步骤 4

    gpg --default-new-key-algo rsa4096 --gen-key
  2. 在提示符下,指定所需的密钥类型,或按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
  3. 输入所需的密钥大小,您的密钥必须至少为4096位。

    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048) 4096
    Requested keysize is 4096 bits
  4. 输入密钥有效的时间长度,按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
  5. 确认您的选择是否正确。

    Is this correct? (y/N) y
  6. 输入您的姓名(或昵称),与此密钥关联的邮箱地址(应与您在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
  7. 根据提示输入一个强密码来保护你的 GPG 密钥,并进行二次确认。至此,已生成GPG密钥对。

导出GPG公钥

  1. 使用以下命令可以列出同时具有公钥和私钥的GPG密钥。 签名提交或标签需要私钥。

    注意:用您的邮箱地址替换<your_email>

    gpg --list-secret-keys --keyid-format LONG <your_email>
  2. 复制以sec开头的GPG密钥ID。 在以下示例中,为30F2B65B9246B6CA

    sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
          D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
    uid                   [ultimate] Codeup <your_email>
    ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
  3. 执行以下命令导出该ID的公钥。GPG密钥的公钥-----BEGIN PGP PUBLIC KEY BLOCK-----开头并以-----END PGP PUBLIC KEY BLOCK-----结尾。

    注意:将示例中30F2B65B9246B6CA替换上一步中的密钥ID。

    gpg --armor --export 30F2B65B9246B6CA

向您的账户添加GPG密钥

重要

添加密钥后,就无法对其进行编辑,只能将其删除。 如果粘贴无效,则必须删除有问题的密钥并重新添加。

  1. 登录云效 工作台,单击右上角个人头像,并在弹出的菜单中单击个人设置

  2. 在个人设置页面,单击GPG 公钥

    高的 - 2024-12-27T140701

  3. 您的GPG公钥粘贴到公钥输入框中,并单击添加。 添加成功后您将能够看到其指纹,相应的邮箱和创建日期。

    请确保GPG密钥的邮箱验证通过,若未验证通过,请添加该邮箱到您的个人信息,或使用现有的邮箱生成新的GPG密钥。

    高的 - 2024-12-05T162811

将您的GPG密钥与Git关联

如果您使用的GPG密钥与您的提交者身份及与Codeup账户相关联的已验证邮箱地址相符,请告知Git使用哪个密钥。

  1. 使用以下命令列出您的GPG密钥

    注意:用您的邮箱地址替换<your_email>

    gpg --list-secret-keys --keyid-format LONG <your_email>
  2. 复制以sec开头的GPG密钥ID。 在以下示例中,为30F2B65B9246B6CA。

    sec   rsa4096/30F2B65B9246B6CA 2017-08-18 [SC]
          D5E4F29F3275DC0CDA8FFC8730F2B65B9246B6CA
    uid                   [ultimate] Codeup <your_email>
    ssb   rsa4096/B7ABC0813E4028C0 2017-08-18 [E]
  3. 告诉Git使用该密钥对提交进行签名。

    注意:用您的GPG密钥ID替换30F2B65B9246B6CA

    git config --global user.signingkey 30F2B65B9246B6CA

    通过--global设置的GPG密钥会作为您的默认密钥,若您希望针对某些仓库使用其他的密钥时,可在对应的仓库下,单独设置,如:

    git config user.signingkey 30F2B65B9246B6CA
  4. (可选)如果Git使用的是gpg,并且出现诸如secret key not availablegpg: signing failed: secret key not available的错误,请运行以下命令更改为gpg2

    git config --global gpg.program gpg2

签名

对提交记录签名

创建GPG密钥并将其添加到您的账户之后,您可以开始对提交进行签名。

  1. 您可以像以前一样提交,唯一的区别是添加了-S标志。

    git commit -S -m "My commit msg"

    或指定密钥ID,如:30F2B65B9246B6CA。

    注意:用您的GPG密钥ID替换30F2B65B9246B6CA

    git commit -S30F2B65B9246B6CA -m "My commit msg"
  2. 在询问时输入GPG 密钥的密码(如有)。

  3. 推送到Codeup并检查您的提交是否已通过验证。如果您不想在每次提交时都键入-S标志,则可以告诉Git自动签名您的提交。

    git config --global commit.gpgsign true

对标签签名

除了对提交记录签名外,也可以针对标签进行签名。

  1. 您可以通过添加-s标志来对标签签名。

    git tag -s mytag

    或指定密钥ID。如:30F2B65B9246B6CA。

    注意:用您的GPG密钥ID替换30F2B65B9246B6CA

    git tag -s -u 30F2B65B9246B6CA mytag
  2. 执行以下命令验证已签名的标签。

    git tag -v mytag
说明

如果您不想在每次创建标签时都键入-s标志,则可以告诉Git自动签名您的提交。

git config --global tag.gpgSign true

签名验证

签名验证状态包括两种:

  • 验证通过。

  • 验证不通过。

当显示验证不通过时,可能为以下几种原因之一:

  • GPG公钥验签未通过。

  • GPG公钥验签通过,提交者邮箱(committer email)属于当前云效用户,但与证书邮箱不一致。

  • GPG公钥验签通过,但提交者邮箱(committer email)与证书邮箱不一致。

  • GPG公钥验签通过,但证书邮箱不属于当前云效用户已绑定的邮箱。

  • GPG公钥未注册到Codeup。

GPG密钥移除

撤销GPG密钥

撤销密钥将取消已签名的提交记录及标签的验证。 使用此密钥验证的提交将变为未验证状态。 撤销此密钥后,将来的提交也将保持不变。如果您的密钥已被盗用,则应使用此操作

  1. 登录云效 工作台,单击右上角个人头像,并在弹出的菜单中单击个人设置

  2. 在个人设置页面,单击GPG 公钥

  3. 鼠标移动到已有公钥上面。单击撤销并在弹出的对话框中单击确定

    撤销后将无法使用该公钥进行提交签名验证,已验证的提交将变为未验证状态。

    image

删除GPG密钥

删除密钥不会取消验证已签名的提交或者标签。 使用此密钥验证的提交或者标签将保持验证状态。 删除此密钥后,只有未推送到Codeup的提交才会保持未验证状态。 要取消验证已签名的提交,您需要从账户中撤销关联的GPG密钥。

  1. 登录云效 工作台,单击右上角个人头像,并在弹出的菜单中单击个人设置

  2. 在个人设置页面,单击GPG 公钥

  3. 鼠标移动到已有公钥上面。单击删除并在弹出的对话框中单击确定

    删除后将无法使用该公钥进行提交签名验证,已验证的提交不受影响。

    image

拒绝未签名的提交或标签(敬请期待)

您可以在仓库的推送规则中配置,拒绝未进行GPG签名的提交。

相关资料