New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

用 GPG 加密 github commits #133

Open
muwenzi opened this Issue Jul 25, 2018 · 2 comments

Comments

Projects
None yet
2 participants
@muwenzi
Owner

muwenzi commented Jul 25, 2018

1. 背景

GnuPG(简称 GPG),它是目前最流行、最好用的开源加密工具之一。

要了解什么是GPG,就要先了解 PGP

1991年,程序员 Phil Zimmermann 为了避开政府监视,开发了加密软件PGP。这个软件非常好用,迅速流传开来,成了许多程序员的必备工具。但是,它是商业软件,不能自由使用。所以,自由软件基金会决定,开发一个PGP的替代品,取名为GnuPG。这就是GPG的由来。

GPG 有许多用途,比如对文件,邮件的加密。而本文要说的是,如何使用 GPG 来加密 Github Commits。

在 Github 上查看一些项目的 Commits 时,会发现「This commit was signed with a verified signature.」字样,具体来说,就是下图示例那样:

image

那为什么要对 commit 进行验证呢?

引用一下 Github 官方的解释:

With GPG keys, tags or commits that you've authored on GitHub are verified and other people can trust that the changes you've made really were made by you.

说白了就是验证你的你的代码提交是不是来源于受信的电脑。当然没有绝对的安全,只是更进一步的确保代码提交是你本人操作。

2. 安装 GPG

macOS:

brew install gnupg gnupg2

Debian / Ubuntu:

sudo apt-get install gnupg

Fedora:

yum install gnupg

3. 生成 GPG keys

gpg --full-generate-key

回车,提示信息如下:

gpg (GnuPG) 2.2.4; Copyright (C) 2017 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: directory '/Users/Kimi/.gnupg' created
gpg: keybox '/Users/Kimi/.gnupg/pubring.kbx' created
请选择您要使用的密钥种类:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (仅用于签名)
   (4) RSA (仅用于签名)
您的选择?

选择加密算法,默认选择第一个选项即可,表示加密和签名都使用 RSA 算法。
选 1,回车。

选择密钥长度,默认为 2048,建议输入 4096。

RSA 密钥长度应在 1024 位与 4096 位之间。
您想要用多大的密钥尺寸?(2048)4096

输入 4096,回车。

设定密钥的有效期。

请设定这把密钥的有效期限。
         0 = 密钥永不过期
      <n>  = 密钥在 n 天后过期
      <n>w = 密钥在 n 周后过期
      <n>m = 密钥在 n 月后过期
      <n>y = 密钥在 n 年后过期
密钥的有效期限是?(0)
密钥永远不会过期

密钥只是个人使用的话,建议选择第一个选项,即永不过期。
输入 0,回车。

系统会问你上述设置是否正确。

以上正确吗?(y/n)y

输入 y,回车。

系统会要求你输入个人信息。

You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

真实姓名:

填入你的名字,需是英文。回车。

电子邮件地址:

填入你的邮箱地址。回车。

注释:

「注释」可以空着不填。回车。
系统会再次让你确认填入的信息。

选定了这个用户标识:
    “Kimi Gao <mrgaonju@gmail.com>”

更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?O

输入 O,回车。
系统会让你设定一个私钥的密码。

image

可以不填选择「OK」。系统这时开始生成密钥,这时会要求你做一些随机的举动,以生成一个随机数。你拿起鼠标随便晃晃,直到完成密钥生成。

我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。

最后,提示生成完毕。

gpg: /Users/Kimi/.gnupg/trustdb.gpg:建立了信任度数据库
gpg: 密钥 39CCA91BEB734105 被标记为绝对信任
gpg: directory '/Users/Kimi/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/Users/Kimi/.gnupg/openpgp-revocs.d/876BA0A4DDFCD1A330ED0A4439CCA91BEB734105.rev'
公钥和私钥已经生成并经签名。

pub   rsa4096 2018-07-24 [SC]
      876BA0A4DDFCD1A330ED0A4439CCA91BEB734105
uid                      Kimi Gao <mrgaonju@gmail.com>
sub   rsa4096 2018-07-24 [E]

4. 列出密钥

命令如下:

gpg --list-keys

输出结果如下:

gpg: 正在检查信任度数据库
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: 深度:0 有效性:  1 已签名:  0 信任度:0-,0q,0n,0m,0f,1u
/Users/Kimi/.gnupg/pubring.kbx
------------------------------
pub   rsa4096 2018-07-24 [SC]
      876BA0A4DDFCD1A330ED0A4439CCA91BEB734105
uid           [ 绝对 ] Kimi Gao <mrgaonju@gmail.com>
sub   rsa4096 2018-07-24 [E]

gpg显示公钥文件名(pubring.gpg)
pub显示公钥特征(4096 位,Hash 字符串和生成时间)
uid显示用户信息
sub显示私钥特征

5. 输出密钥

公钥文件(.gnupg/pubring.kbx)以二进制形式储存,armor 参数可以将其转换为 ASCII 码显示。

gpg --armor --output [输出文件名] --export [密钥ID]

[密钥ID]指定用户的公钥,如 876BA0A4DDFCD1A330ED0A4439CCA91BEB734105 参数指定输出文件名,如 public-key.txt

同理,export-secret-keys 参数可以转换私钥。

gpg --armor --output private-key.txt --export-secret-keys

public-key.txt 和 private-key.txt 默认会导出至用户目录 /Users/<用户名>/

6. 上传公钥至 Github 帐号

点击用户头像,打开 Settings,左侧菜单点击 SSH and GPG keys,在 GPG keys 那里,点击 New GPG key
在输入框里填入刚刚导出的 public-key.txt 内容。
点击 Add GPG key,完成上传。

详细参考:GithubHelp - Adding a new GPG key to your GitHub account

7. 设置 Git

根据刚才 gpg –list-keys 显示的结果,此时已经知道密钥 ID 为 876BA0A4DDFCD1A330ED0A4439CCA91BEB734105。
设置 Git 使用该密钥 ID 加密:

git config --global user.signingkey  876BA0A4DDFCD1A330ED0A4439CCA91BEB734105

设置 Git 全局使用该密钥加密:

git config --global commit.gpgsign true

最后,再输入以下命令查看 Git 配置情况:

git config -l

包含以下信息:

user.signingkey=876BA0A4DDFCD1A330ED0A4439CCA91BEB734105
commit.gpgsign=true

至此,使用 GPG 加密 Github Commits 就正式完成了。
以后再 Git Commit,同步到 Github 上之后,就会发现该 Commit 已显示 Verified:

image

8. 参考资料

  1. How to resolve “gpg: command not found” error during RVM installation?
  2. GPG入门教程 作者:阮一峰
  3. 使用 GPG 加密 Github Commits 作者:秋水逸冰
@Chyroc

This comment has been minimized.

Chyroc commented Jul 25, 2018

尝试了下,我的机器上还需要执行下面的代码,否则commit的时候报错:cannot run gpg2: No such file or directory

git config --global gpg.program $(which gpg)
@muwenzi

This comment has been minimized.

Owner

muwenzi commented Jul 25, 2018

@Chyroc 不好意思,我当时装的时候是参考stackoverflow上运行的brew install gnupg gnupg2,以为gnupg2 没有用,brew install gnupg gnupg2的话后面就没有报错

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment