GPG 签名是对代码提交者进行身份验证的一种补充,即证明代码提交来密钥持有者,理论上可以确保在目前的破译技术水平下无法篡改内容。您可以使用 GPG 工具 (GNU Privacy Guard) 生成密钥,对 Git 仓库中所做的提交进行签名。

Gitea 服务器在检查代码签名时利用用户提供的 GPG 公钥验证代码提交者的身份。如果希望强制启用签名,您可以为您的项目配置分支保护规则,拒绝未使用 GPG 签名的提交,或拒绝来自未验证用户的提交。

GnuPG 实现不同于 OpenPGP,本文使用 GPG 来指代所有 OpenPGP、PGP 和 GPG 相关的工具。

在使用 GPG 签名代码前,需要考虑以下问题:

  • 提交者必须具有 GPG 密钥对,即公钥私钥。公钥支持公开分享,私钥不得分享并且必须加密保存。
  • 提交者的公钥必须上传到他们的 Gitea 帐户
  • 提交者的电子邮件地址应当与 GPG 密钥中的电子邮件地址相匹配。
  • GPG 公钥中的其中一个电子邮件地址应当与 Gitea 账号中已验证的电子邮件地址匹配
  • 如果要隐藏提交者真实的电子邮件地址,请在 GPG 密钥和 Git 签名中使用 Gitea 自动生成的隐藏电子邮件域,例如 alice@noreply.gitea.io
  • GPG 密钥有四种用途,分别是 签名(S)、加密(E)、认证(A)、授权(C)。这里仅做签名使用。

由于 Gitea 使用自己数据库中的的密钥环来验证 GPG 签名,因此它不依赖任何第三方公钥服务器。

查看任意 Gitea 用户的 GPG 公钥

要查看 Gitea 用户的 GPG 公钥,您可以:

  • 访问 https://gitea.com/<USERNAME>.gpg

    • 如果用户配置了 GPG 密钥,将显示完整的 GPG 公钥链
    • 没有配置 GPG 密钥的用户将显示 Note: This user hasn't uploaded any GPG keys.
  • 转到用户的账户设置(例如https://gitea.com/user/settings/keys)。在账户设置的顶部导航栏,选择 SSH / GPG 密钥

配置提交签名

要签名提交,您必须同时配置本地计算机和 Gitea 帐户:

  1. 创建 GPG 密钥对
  2. 将 GPG 公钥添加到您的帐户
  3. 将您的 GPG 密钥与 Git 关联
  4. 签名您的 Git 提交

创建 GPG 密钥

如果您还没有 GPG 密钥,请创建:

1.根据您的操作系统安装 GnuPG工具。

2.生成您的密钥对:

# 使用基础的密钥生成向导,可以选择产生 RSA\DSA 密钥对
gpg --full-generate-key # 或则,使用专家模式,可以选择更多密钥算法,例如 ECC(本文推荐)
gpg --full-generate-key --expert

3.选择密钥一个密钥算法,输入对应的数字序号并按 Enter 键确认选项。这里我们选择了 (9) ECC and ECC

4.选择椭圆曲线(elliptic curve)算法时建议选用 (1) Curve 25519

5.指定密钥的有效期限。有效期限属于君子协议,是为了确保密钥在公共密钥服务器上可维护性,这里我们使用默认值 0 表示永不过期。

6.确认之前的所有配置,请输入 y

7.输入您的姓名。

8.输入您的电子邮件地址。这里的邮箱地址必须与 Gitea 帐户中的 已验证电子邮件地址 匹配。

9.可选。输入密钥评论信息,此信息会显示在密钥联系人姓名旁的括号中。

10.最后 GPG 生成向导将显示您之前输入的信息。根据提示重新编辑信息或按 O(表示 Okay)继续。

11.输入强密码,并且再次输入确认。此密码用于加密 GPG 私钥。

12.列出 公钥 ID,请运行命令 gpg -k,列出 私钥 ID,请运行命令 gpg -K。我们发现同一个密钥对的私钥和公钥 ID 是一样的。

13.在输出中,找到 pub/sec 所在的段落,并复制 GPG 密钥 ID。例如 F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7

$ gpg -k
/home/user/.gnupg/pubring.kbx
------------------------------
pub ed25519 2022-12-30 [SC]
F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7
uid [ultimate] Gitea User (Test) <user@example.com>
sub cv25519 2022-12-30 [E]

14.要导出公钥,请运行以下命令,将 <ID> 替换为上一步中的 GPG 密钥 ID 或者 邮件地址:

gpg --armor --export <ID>

15.复制公钥时,应当包含 -----BEGIN PGP PUBLIC KEY BLOCK----------END PGP PUBLIC KEY BLOCK----- 以及其中的所有字段。

将 GPG 密钥添加到您的帐户

将 GPG 密钥添加到您的帐户:

  1. 登录 Gitea。
  2. 在右上角,选择您的头像。
  3. 选择 设置
  4. 在顶部导航栏,选择 SSH / GPG 密钥
  5. 增加密钥 中,粘贴您的 公钥
  6. 要将密钥添加到您的帐户,请选择 添加密钥。Gitea 显示密钥的指纹、电子邮件地址和创建日期:

添加密钥成功后,您将无法再次对其进行编辑。您可以删除已有的密钥并重新添加它。如果公钥中的邮箱地址与账户绑定的邮箱地址不匹配,您仍然可以将其添加到 Gitea 公钥链中,但在启用该密钥前需要使用您的私钥进行二次验证,以确认密钥的所有权。

将您的 GPG 密钥与 Git 关联

创建 GPG 密钥并将其添加到您的 Gitea 帐户后,您可以配置 Git 并在提交代码时使用此密钥:

1.运行命令 gpg -k 列出您刚刚创建的 GPG 密钥的 ID。

2.复制以 pub/sec 开头的 GPG 密钥 ID。在本例中,密钥 ID 为 F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7

$ gpg -k
/home/user/.gnupg/pubring.kbx
------------------------------
pub ed25519 2022-12-30 [SC]
F4F23C3AEAB6A60030BBC558EA2C102A984A2CD7
uid [ultimate] Gitea User (Test) <user@example.com>
sub cv25519 2022-12-30 [E]

2.运行下面的命令配置 Git 以使用您指定的密钥签名您的提交,将 <KEY ID> 替换为您的 GPG 密钥 ID:

git config --global user.signingkey <KEY ID>

签名您的 Git 提交

将公钥添加到您的帐户后,您可以手动签名单个提交,或将 Git 配置为默认为所有提交签名:

  • 添加 GPG_TTY 添加到本地系统用户的 Bash 环境变量
[ -f ~/.bashrc ] && echo 'export GPG_TTY=$(tty)' >> ~/.bashrc
  • 手动签名单个 Git 提交:

    1. -S 标志添加到您要签名的任何提交:

      git commit -S -m "first commit"
    2. 签名时会弹出提示框。询问 GPG 密钥的密码。

  • (可选)对所有 Git 提交进行签名:

    git config --global commit.gpgsign true

验证提交

您可以查看合并请求或整个项目的提交:

  1. 查看项目的提交:选择 仓库 > 提交

  2. 查看合并请求的提交:选择 仓库 > 合并请求,然后选择其中一个合并请求,检查代码提交记录。

  3. 确定您要查看的提交。根据 GPG 签名的验证状态,已签名的提交会显示 绿锁黄锁灰锁 徽章。未签名的提交不显示徽章:

  4. 要显示提交的签名详细信息,请选择 GPG 签名徽章:

吊销和删除 GPG 密钥

如果 GPG 密钥被泄露,请即使吊销并从服务器删除密钥。删除密钥后会对之前基于此密钥的提交造成影响,具体表现为:经过此密钥签名的提交被标记为未验证。

要从您的帐户中删除 GPG 密钥:

  1. 在右上角,选择您的头像。
  2. 选择 设置
  3. 在顶部导航栏,选择 SSH / GPG 密钥
  4. 点击要删除的 GPG 密钥旁边的 删除 按钮。

使用 GPG 签名提交的更多相关文章

  1. [git]使用GPG签名你的commit

    概述 GPG是一种加密算法,现在github支持commit使用GPG加密,从而保证提交的commit在传输的过程中没有被篡改. 一.生成GPG密钥 什么是GPG:阮一峰的GPG教程 安装GPG:br ...

  2. 带GPG签名的Git tag

    原文地址http://airk000.github.io/git/2013/09/30/git-tag-with-gpg-key Git tag ###Tag用来做什么? Tag即标签,用以给项目仓储 ...

  3. linux SElinux防护 加密解密 gpg签名与认证

    SElinux Security-Enhanced Linux由美国国家安全局主导开发一套强化linux安全的mac扩展模块 selinux的运作机制:集成到linux内核上(2.6及以上)操作系统提 ...

  4. Linux之RPM GPG签名

    原文地址:http://linux.chinaunix.net/techdoc/system/2007/09/26/968723.shtml GPG在Linux上的应用主要是实现官方发布的包的签名机制 ...

  5. gpg签名用法

    – 在CentOS 6上生成公钥/私钥对 [root@localhost ~]# gpg --gen-key gpg (GnuPG) ; Copyright (C) Free Software Fou ...

  6. 在 Git 提交信息中使用 Emoji

    Gitmoji 旨在解释如何在 Git 提交消息时使用表情符号.在提交信息时使用表情符号,可以更容易地识别提交的目的或意图. Emoji 列表 :优化项目结构 / 代码格式 :art: ️ :性能提升 ...

  7. git常用命令自己梳理总结

    一.新建代码库 # git-init - 创建一个空的 Git 存储库或重新初始化一个现有的存储库 $ git init # 在本地新建一个repo,进入一个项目目录,执行git init,会初始化一 ...

  8. yum安装时提示“尚未安装任何 GPG 公钥,请下载您希望安装的软件签名公钥并安装”

    在Linux操作系统中,安装软件依赖包时,出现了尚未安装任何 GPG 公钥,要求使用rpm --import public.gpg.key导入  问题: [root@server7 yum.repos ...

  9. [Android]使用Gradle提交自己开源Android库到Maven中心库

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/4388175.html 此文针对开源爱好者. 如果你想让别人使用 ...

  10. GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流

    最近听同事说他都在使用GitHub,GitHub是程序员的社区,在里面可以学到很多书上学不到的东西,所以最近在准备入手这方面的知识去尝试学习,正好碰到这么详细完整的文章,就转载了,希望对自己和大家有帮 ...

随机推荐

  1. 驱动开发:内核枚举Registry注册表回调

    在笔者上一篇文章<驱动开发:内核枚举LoadImage映像回调>中LyShark教大家实现了枚举系统回调中的LoadImage通知消息,本章将实现对Registry注册表通知消息的枚举,与 ...

  2. c语言中 -> 的用法

    ->是一个整体,它是用于指向结构体. 1.换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到"->&quo ...

  3. Python基础之函数:2、globlal与nonlocal和闭包函数、装饰器、语法糖

    目录 一.global与nonlocal 1.global 2.nonlocal 二.函数名的多种用法 三.闭包函数 1.什么是闭包函数 2.闭包函数需满足的条件 3.闭包函数的作用 4.闭包函数的实 ...

  4. LoadRunner11脚本小技能之添加请求头+定义变量+响应内容乱码转换打印+事务拆分

    一.添加请求头 存在一些接口,发送请求时需要进行权限验证.登录验证(不加请求头时运行脚本,接口可能会报401等等),所以需要在脚本中给对应请求添加请求头.注意:请求头需在请求前添加,包含url类.su ...

  5. 修改input标签里面的提示文字(placeholder)的样式

    使用 ::-webkit-input-placeholder 伪类 input::-webkit-input-placeholder{ // 修改字体大小 font-size:12px; // 修改文 ...

  6. 这次,听人大教授讲讲分布式数据库的多级一致性|TDSQL 关键技术突破

    近年来,凭借高可扩展.高可用等技术特性,分布式数据库正在成为金融行业数字化转型的重要支撑.分布式数据库如何在不同的金融级应用场景下,在确保数据一致性的前提下,同时保障系统的高性能和高可扩展性,是分布式 ...

  7. 【云原生 · Kubernetes】部署高可用 kube-controller-manager 集群

    个人名片: 因为云计算成为了监控工程师‍ 个人博客:念舒_C.ying CSDN主页️:念舒_C.ying 部署高可用 kube-controller-manager 集群 12.1 创建 kube- ...

  8. vue 3.0 常用API 的介绍

    vue3.0 生命周期 写法一 和vue2.x 一致 区别在于(beforeUnmount.unmount)名称不一样 写法二 在setup 中使用, 需要引用 如: import { onBefor ...

  9. 3 c++编程-提高篇-模版

    ​ 重新系统学习c++语言,并将学习过程中的知识在这里抄录.总结.沉淀.同时希望对刷到的朋友有所帮助,一起加油哦!  生命就像一朵花,要拼尽全力绽放!死磕自个儿,身心愉悦!  系列文章列表: 1 c+ ...

  10. 使用Python实现多线程、多进程、异步IO的socket通信

    多线程实现socket通信服务器端代码 import socket import threading class MyServer(object): def __init__(self): # 初始化 ...