gpg 加密操作流程

GPG(GNU Privacy Guard) 是一个加密、签名通信内容以及解密的内容的软件,采用的加密方式是非对称加密(即加密和解密使用的密钥不相同,例如使用公钥和私钥)[^1]。它的诞生是因为作为商业软件的 PGP ,不能自由使用,因此 FSF 开发的 GNU 版本。本篇笔记是为了阐释 git 在使用签署过程中,演示加密操作。

1. 安装

在 Mac 下安装 GnuPG 可以直接使用 homebrew 工具进行安装,直接使用命令:

1
$ brew install gpg

2. 密钥生成

gpg 采用非对称加密,因此在进行加密和解密操作之前需要有相应的私钥和公钥,而生成相应的密钥的命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 因 gpg 版本不同,生成密钥过程的命令存在一些差异

<< comment
gpg 版本低于 2.1.17 使用如下命令:
--default-new-key-algo 选项用于选择使用的加密算法和最小位数,
rsa4096 表示 rsa 算法加密至少 4096 bits
comment

$ gpg --default-new-key-algo rsa4096 --gen-key

<< comment
gpg 版本高于 2.1.17 使用如下命令,以交互形式生成密钥
comment

$ gpg --full-generate-key

以上是 GitHub 文档建议的密钥生成方式,但是可以直接使用 gpg --gen-key 来生成(但生成密钥的流程操作顺序可能不一致,但完整的流程过程是一致的)。输入 gpg --full-generate-key 之后会进行如下流程

  1. 选择加密算法选项:

    gpg (GnuPG) 2.2.22; Copyright (C) 2020 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.

    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)
    (14) Existing key from card
    Your selection?

    推荐使用 RSA 算法,即使用默认选项或者第四个 RSA 签名选项

  2. 设置密钥长度:

    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (3072)

    一般情况下是长度越高,密码越安全

  3. 设置有效期

    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 表示永久有效,后面非别表示对应的多少天、周、月以及年的有效期。

在完成确认之后需要补充个人信息,包括姓名、邮箱地址以及备注信息。填充信息之后,会再次要求输入 passphrase 以保护私钥。

3. 密钥管理

3.1 密钥导出

生成的密钥是一个二进制文件,需要使用公钥和私钥对应的 ASCII 数值需要进行转换,之后才能上传到相应的服务器上(例如 GitHub 上)。

3.1.1 公钥导出

使用命令 gpg --armor --output <filename> --export <uid> 可以将对应 uid 的私钥导出到指定的 filename 文件中

对于导出的公钥可以直接复制应用于 GitHub 中,和 SSH 生成的公钥应用方法类似。

3.1.2 私钥导出

使用命令 gpg --armor --output <filename> --export-secret-keys <uid> 可以将将私钥导出,私钥导出需要密码

问题

1. gpg 签名失败

在使用 git tag -s <tag_name> 报错:

error: gpg failed to sign the data
error: unable to sign the tag
The tag message has been left in .git/TAG_EDITMSG

因为环境变量中没有设置 GPG_TTY,在 bash_profile 中添加上 export GPG_TTY=$(tty) 即可

参考

[^1]: GnuPG - 维基百科,自由的百科全书
[^2]: GPG入门教程 - 阮一峰的网络日志

作者

ZenRay

发布于

2020-09-01

更新于

2021-04-11

许可协议

CC BY-NC-SA 4.0