GnuPG 安装与使用

目录

1. 关于 GPG

1.1. GPG 是什么?

GnuPG,即 GNU Privacy Guard (GPG) 是一个密码学软件,用于加密、签名内容及管理非对称密钥。

GPG 的核心是 GPG 密钥对,分为公钥和私钥。在密码学技术上,GPG 可以使用若干不同的加密算法来向外提供加密解密服务。

1.2. KEYID 是什么?

KEYID 就是你的 GPG Key 指纹的缩短版:

Long Fingerprint 的末尾 16 位数字
Short Fingerprint 的末尾 8 位数字

在很多命令中,--keyid-format [none|short|0xshort|long|0xlong] 可以决定 KEYID 的显示格式。

1.3. USER-ID 是什么?

USER-ID 通常是指你为邮箱地址所关联的姓名字段,有时候也指所关联的注释文本。

2. 安装 GPG

2.1. macOS

https://gpgtools.org

2.2. windows

https://gpg4win.org/download.html

2.3. Linux

gpg --version # 查看是否安装
sudo apt-get install -y gnupg
sudo yum install -y gnupg

3. GPG 密钥管理

3.1. 生成 GPG 密钥对

gpg --full-generate-key
  • gpg 密钥是与 email 绑定的,它是一个身份证明。
  • 算法建议选择默认值 RSA,其用途是完整的。
  • 密钥强度首选 4096 bits。
  • 建议生成一个不过期的根密钥,然后再建立若干子密钥,用于不同的用途。

3.2. 列出密钥

# 列出公钥和指纹
gpg --list-keys --keyid-format=short

# 列出私钥和指纹
gpg --list-secret-keys -keyid-format=short

参数 --keyid-format 可以指定长度。

3.3. 列出指纹

gpg --fingerprint me@wangyan.org

3.4. 生成子密钥

gpg --expert --edit-key 2E0E8722
gpg> addkey

3.5. 删除密钥

# 删除公钥
gpg --delete-key [USER-ID or KEYID]

# 删除私钥
gpg --delete-secret-key [USER-ID or KEYID]

3.6. 导出密钥

# 导出公钥
gpg --armor --output user.gpg.public.asc --export MASTER-KEYID

# 导出私钥
gpg --armor --output user.gpg.private.key.asc --export-secret-keys MASTER-KEYID

# 不导出子密钥
gpg --armor --output user.gpg.private.key.asc --export-secret-keys MASTER-KEYID!

# 导出指定子密钥
gpg --armor --output 2E0E8722.pub.asc --export 2E0E8722
  • 默认导出主密钥的同时,将会连同其全部子密钥一起导出
  • 根据非对称密钥体系原理,导出私钥就代表着同时也导出了公钥,因为私钥能够推导出公钥。
  • 使用子密钥的公钥KEYID,可以指定导出子密钥

3.7. 导入密钥

gpg --import user.gpg.public.pem
gpg --import user.gpg.private.key

3.8. 信任密钥

重新导入密钥后会显示未知,因此需要信任。

gpg --edit-key user@useremail.com
gpg> trust
gpg> 5
gpg> save

导出信任文件:gpg --export-ownertrust > file.txt

3.9. 分发公钥

一旦密钥创建就绪,你就可以将其发表到 GPG 公共服务器,其他人通过指纹或者邮箱地址能够检索到你的公钥。

# 默认发布到 hkps://keys.openpgp.org 服务器
gpg --send-keys 2E0E8722

# 发布到指定服务器
gpg  --keyserver hkps://keyserver.ubuntu.com --send-keys 2E0E8722

3.10. 检索公钥

# 检索默认服务器
gpg --search-keys 70B152332E0E8722
gpg --auto-key-locate keyserver --locate-keys no-reply@wangyan.org

# 检索指定服务器
gpg --keyserver hkps://keyserver.ubuntu.com --search-keys 70B152332E0E8722
gpg --keyserver hkps://keyserver.ubuntu.com --search-keys no-reply@wangyan.org

3.11. 接收他人的公钥

# 使用 Long-KEYID 从指定服务器接收
gpg --keyserver hkps://keyserver.ubuntu.com --recv-keys 70B152332E0E8722

3.12. 签名他人公钥

  1. 接收他的公钥

    gpg -recv-keys 70B152332E0E8722

  2. 签名这个公钥

    gpg –ask-cert-level –sign-key no-reply@wangyan.org

  3. 签名后导出

    #使用他的公钥加密签名再导出 gpg -a –export no-reply@wangyan.org | gpg -se -r no-reply@wangyan.org > no-reply@wangyan.org.asc.pgp

  4. 接收方解密并导入

    gpg –decrypt no-reply@wangyan.org.asc.pgp > no-reply@wangyan.org.asc gpg –import no-reply@wangyan.org.asc

  5. 发布新公钥到服务器

    gpg –send-keys no-reply@wangyan.org.

4. GPG 文件操作

4.1. 加解与解密

4.1.1. 加密

gpg -e -r 2E0E8722 original.file
  • -e, --encrypt 加密数据
  • -r, --recipient 为 USER-ID 加密
  • 加密后默认生成一个新文件 original.file.gpg

4.1.2. 解密

gpg -d -r 2E0E8722 original.file.gp
  • -d, --decrypt 解密数据

4.2. 签名与验证

4.2.1. 签名且加密

gpg -u 2E0E8722 -s original.file
  • -u, --local-user 使用 USER-ID 来签名或者解密
  • -s, --sign 生成一份签名
  • 这会生成一个加密文件 original.file.gpg,同时它也是被签名的。
  • 发给他人,只需分发加密文件,无需附带原始文件。

4.2.2. 只签名不加密

gpg -u 2E0E8722 -a -b -s original.file
  • -a, --armor 创建 ASCII 字符封装的输出
  • -b, --detach-sign 生成一份分离的签名
  • 签名后生成一个纯文本的签名文件 original.file.asc。
  • 发给他人,需要和原始文件一同分发。

4.2.3. 只签名不加密,且使用明文签名

gpg -u 2E0E8722 --clear-sign original.file
  • --clear-sign 生成一份明文签名
  • 区别在于包含了原始文件的内容,无需和原始文件一同分发。

4.2.4. 验证

gpg -u 2E0E8722 --verify original.file.gpg
gpg -u 2E0E8722 --verify original.file.asc

5. GPG 吊销操作

一旦发布到 keyserver 上,你的 GPG Key 就不能被真正删除了。

对于失效的、过时的、可能已经泄漏的密钥,你要使用吊销功能。

5.1. 生成吊销证书

gpg --output revoke.asc --gen-revoke key-ID 

5.2. 导入吊销证书

gpg --import revoke.asc 
  • 注意:吊销并不删除密钥本身,它是标记该密钥被作废了

5.3. 撤销密钥服务器上的密钥

gpg --keyserver hkps://keys.openpgp.org --send-keys key-ID
  • 已标记作废的密钥会被发送到服务器

6. Git 配置

git config --global gpg.program gpg
git config --global commit.gpgsign true
git config user.name wangyan
git config user.email no-reply@wangyan.org
git config user.signingkey 2E0E8722
git commit -S -m your commit message

参考文档:

ESC