GnuPG 安装与使用

slug
gpg-guide
tags
gpg
gnupg
date
Aug 16, 2024
summary
GnuPG,是用于加密、签名内容及管理非对称密钥的工具。
status
Published
type
Post

1. 关于 GPG

1.1. GPG 是什么?

GPG,即 GNU Privacy GuardGnuPG)是一个密码学软件,用于加密、签名内容及管理非对称密钥。
GPG 的核心是 GPG 密钥对,分为公钥和私钥。在密码学技术上,GPG 可以使用若干不同的加密算法来向外提供加密解密服务。

1.2. KEYID 是什么?

KEYID 就是你的 GPG 指纹的短版本:
长 KEYID:Fingerprint 的末尾 16 位数字 短 KEYID:Fingerprint 的末尾 8 位数字
在很多命令中,--keyid-format [none|short|0xshort|long|0xlong] 可以决定 KEYID 的显示格式。

1.3. USER-ID 是什么?

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

2. 安装 GPG

2.1. macOS

2.2. windows

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. 接收他的公钥
    1. gpg -recv-keys 70B152332E0E8722
  1. 签名这个公钥
    1. gpg --ask-cert-level --sign-key no-reply@wangyan.org
  1. 签名后导出
    1. #使用他的公钥加密签名再导出 gpg -a --export no-reply@wangyan.org | gpg -se -r no-reply@wangyan.org > no-reply@wangyan.org.asc.pgp
  1. 接收方解密并导入
    1. gpg --decrypt no-reply@wangyan.org.asc.pgp > no-reply@wangyan.org.asc gpg --import no-reply@wangyan.org.asc
  1. 发布新公钥到服务器
    1. 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
参考文档:
 
If you have any questions, please contact me.