介绍
上一篇文章介绍了 GPG 的核心概念,这篇文章着重介绍 GPG 的实战操作。 不过,在实战之前,我们需要先熟悉如何配置 GPG 工具,磨刀不误砍柴工。
1、安装
Linux 系统通常会自带,MacOS 我们可以使用 brew 来安装
brew install gpg
2、HOME 目录
~/.gnupg 目录结构:
我们可以把默认目录强制指定为 $HOME/.local/share/gnupg,如下:
export GNUPGHOME="${XDG_DATA_HOME:-$HOME/.local/share}/gnupg"
也可以在执行 gpg 命令时用 --homedir 指定 home directory。
3、配置文件
(1) ~/.gnupg/gpg.conf 这是标准的配置文件
(2) ~/.gnupg/common.conf 可选的配置文件,如果 ~/.gnupg 目录不存在,则会自动生成一个 ~/.gnupg/common.conf,里面的内容是 use-keybox,意思是默认使用 keybox 格式。
~/.gnupg/ 目录中的这两个配置文件有不同的用途:
- gpg.conf:
- 专门用于 gpg 命令行工具的配置
- 影响加密、签名等核心操作的行为
- 用户最常修改的配置文件
常见的 gpg.conf 配置项包括:
# 默认密钥
default-key 0xFF00FF00
# 首选加密算法
personal-cipher-preferences AES256 AES192 AES CAST5
# 首选压缩算法
personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed
# 首选摘要算法
personal-digest-preferences SHA512 SHA384 SHA256 SHA224
# 密钥服务器
keyserver hkps://keys.openpgp.org
# 显示照片 ID
photo-viewer "display %i"
# 总是显示密钥指纹
with-fingerprint
# 验证签名时显示公钥指纹
verify-options show-uid-validity
list-options show-uid-validity
# 自动获取密钥
auto-key-locate keyserver
- common.conf:
- 包含所有 GnuPG 工具共享的基本配置
- 影响 gpg、gpgsm、gpg-agent 等所有组件
- 通常不需要修改
一般建议:
- 日常使用主要修改 gpg.conf
- 除非你明确知道要修改什么,否则保持 common.conf 默认
- 对安全性要求高的配置放在 gpg.conf 中
- 使用注释说明重要配置的用途
下面是各个文件的作用:
~/.gnupg/pubring.gpg这是旧格式的公钥环。最新版本的 gpg 已经采用了新的 keybox 格式。 新格式的文件是~/.gunpg/pubring.kbx。
gpg 兼容旧格式,所以两种都可以使用。但是 gpg 默认会把所有密钥对保存在 pubring.kbx 中。
请注意,如果 pubring.gpg 和 pubring.kbx 两个文件同时存在,但如果后者中没有保存任何密钥的话,那么将使用旧文件 pubring.gpg。
注意:GnuPG 2.1之前的版本将始终使用文件 pubring.gpg,因为它们不知道新的 keybox 格式。如果你需要使用 GnuPG 1.4 解密数据,你应该保留这个文件。
如果我们直接执行 gpg --list-keys 命令,那就是把 ~/.gnupg/pubring.kbx 中保存的 keys 信息列出来。
如果我们想列出指定 .kbx 文件中的 keys 信息(比如 /etc/apt/trusted.gpg.d/ 目录下的某 key 文件),我们可以用 --no-default-keyring 配合 --keyring 选项来实现,如下:
gpg --list-keys --no-default-keyring --keyring /etc/apt/trusted.gpg.d/ubuntu-keyring-2018-archive.gpg
--no-default-keyring选项的意思不实用默认的~/.gnupg/pubring.kbx文件--keyring选项是指定数据库。
迁移
下面是把旧格式(~/.gnupg/pubring.gpg) 中的密钥迁移到新格式 ~/.gnupg/pubring.kbx 中的具体步骤:
(1)使用 gpg --list-keys 会触发自动迁移
(2)也使用更明确的命令:
# 导出所有密钥
gpg --export-options backup --export > pubkeys.gpg
gpg --export-secret-keys --export-options backup > seckeys.gpg
# 创建新的 keybox 格式数据库
mv ~/.gnupg/pubring.gpg ~/.gnupg/pubring.gpg.old
mv ~/.gnupg/secring.gpg ~/.gnupg/secring.gpg.old
# 导入密钥到新格式
gpg --import pubkeys.gpg
gpg --import seckeys.gpg
完成后可以验证:
gpg --list-keys
如果一切正常,可以删除备份文件:
rm pubkeys.gpg seckeys.gpg
rm ~/.gnupg/*.gpg.old
注意:执行这些操作前最好先备份整个 ~/.gnupg 目录。
~/.gnupg/pubring.gpg.lock公钥环的锁文件。~/.gnupg/pubring.kbx使用新 keybox 格式的公钥环。此文件与 gpgsm 共享。
如果想要将现有的 pubring.gpg 文件转换为 keybox 格式,应该首先备份 ownertrust 值,然后将 pubring.gpg 重命名为 publickeys.backup,以便任何 GnuPG 版本都无法识别。然后执行导入操作,最后恢复 ownertrust 值。具体步骤如下:
$ cd ~/.gnupg
$ gpg --export-ownertrust > otrust.lst
$ mv pubring.gpg publickeys.backup
$ gpg --import-options restore --import publickeys.backup
$ gpg --import-ownertrust otrust.lst
~/.gnupg/pubring.kbx.lockpubring.kbx 的锁文件。~/.gnupg/secring.gpgGnuPG 2.1 之前版本使用的旧版秘密钥环。GnuPG 2.1及更高版本不使用它。如果你需要使用 GnuPG 1.4 解密存档数据,你可能需要保留它。~/.gnupg/secring.gpg.lock旧版秘密钥环的锁文件。~/.gnupg/.gpg-v21-migrated指示已迁移到 GnuPG 2.1 的文件。~/.gnupg/random_seed用于保存内部随机池状态的文件。~/.gnupg/openpgp-revocs.d/这是 gpg 存储预生成撤销证书的目录。文件名对应于相应密钥的 OpenPGP 指纹。建议备份这些证书,如果主私钥未存储在磁盘上,将它们移动到外部存储设备。任何能够访问这些文件的人都可以撤销相应的密钥。你可能需要打印出来。你应该备份此目录中的所有文件,并注意将此备份妥善保管。
信任数据库 trustdb.gpg
~/.gnupg/trustdb.gpgtrustdb.gpg 是 GPG 的信任数据库文件,它存储了你对其他人的公钥的信任级别信息。具体来说:
- 它记录了:
- 你对每个密钥的信任度评级
- 密钥的有效性判断
- 密钥所有者的身份验证状态
- 信任级别包括:
- unknown (未知)
- none (不信任)
- marginal (部分信任)
- full (完全信任)
- ultimate (终极信任,通常只给自己的密钥)
- 查看信任数据库:
gpg --list-keys --with-trust-model=trust-db
- 编辑信任级别:
gpg --edit-key user@example.com
> trust
如果这个文件损坏,GPG 会自动重新创建,但你之前设置的信任关系会丢失,需要重新建立。
所以备份 ~/.gnupg 目录时也要记得包含这个文件。
补充知识:
我们在 Debian 系的 Linux 系统中使用 apt 时还会经常见到下面两个东西:
/etc/apt/trusted.gpg
/etc/apt/trusted.gpg.d
它们的作用也是类似的,是信任数据库。每当我们要在 /etc/apt/sources.list 中添加一个新的仓库源时,我们都需要把这个新源的公钥添加到 /etc/apt/trusted.gpg 中。
为什么信任数据库(trustdb.gpg) 仍然使用 .gpg 格式而不是 .kbx 格式,
- 历史原因:
- .kbx (keybox) 格式主要是为了替代密钥存储 (
pubring.gpg/secring.gpg) - trustdb.gpg 的功能和结构与密钥存储不同,没有迁移的迫切需求
- 功能区别:
- keybox 格式针对密钥管理进行了优化
- trustdb 只存储简单的信任关系数据,原有格式已经足够
- 兼容性考虑:
- 保持 trustdb.gpg 格式不变可以确保与旧版本 GnuPG 的兼容性
- 不同 GnuPG 版本间可以更容易地共享信任数据
实际上,到目前为止 GnuPG 的开发团队也没有计划将 trustdb 迁移到 .kbx 格式,因为现有格式运作良好,没有明显的改进需求。
~/.gnupg 目录下有 S.dirmngr 和 S.keyboxd 两个 socket 文件,它们是干啥用的?
dirmngr 和 keyboxd 是 GnuPG 的两个守护进程,而这些 .S 文件是它们的 Unix domain sockets:
- S.dirmngr:
- dirmngr 是证书和密钥管理守护进程
- 负责与密钥服务器通信
- 处理 CRL(证书吊销列表)和 OCSP(在线证书状态协议)请求
- 通过这个 socket 文件与其他 GnuPG 组件通信
- S.keyboxd:
- keyboxd 是密钥数据库访问守护进程
- 管理 pubring.kbx 文件的访问
- 提供密钥查询和管理服务
- 通过这个 socket 文件为其他组件提供密钥访问服务
这些 socket 文件:
- 用于进程间通信(IPC)
- 自动创建和管理
- 不需要手动修改
- 进程停止时会自动删除
如果这些 socket 文件出现问题,可以:
gpgconf --kill all # 停止所有 GnuPG 守护进程
rm ~/.gnupg/S.* # 删除所有 socket 文件
gpg --list-keys # 重新启动守护进程
实战案例
gpgconf
(1) 查看或修改配置组件或信息
gpgconf --list-components
gpgconf --list-dirs
(2)更改默认的 key server
gpgconf --set-config gpg --keyserver hkp://keyserver.ubuntu.com
(3) 重置
gpgconf --unset-config gpg --keyserver
(4) 为某个组件创建新的配置文件
gpgconf --create-config gpg-agent
(5) 重载某个组件
先 kill 再 launch
gpgconf --kill gpg-agent
gpgconf --launch gpg-agent
(6) 导出配置
gpgconf --list-config > gpg-config-backup.txt
dirmngr 组件
dirmngr 是 GnuPG 的一个组件,主要负责网络相关的操作。启动方法:
- 直接启动:
dirmngr --daemon
- 通过 gpgconf 启动:
gpgconf --launch dirmngr
dirmngr 的主要功能:
- 密钥服务器通信
- 处理密钥的查找
- 处理密钥的获取
- 处理密钥的上传
- 证书验证
- 获取 CRL(证书吊销列表)
- 处理 OCSP 请求
- 验证 X.509 证书链
- 检查运行状态:
gpgconf --list-dirs dirmngr-socket # 查看 socket 位置
gpgconf --status-of-socket dirmngr # 检查状态
- 查看日志:
dirmngr --daemon --debug-level basic --log-file ~/.gnupg/dirmngr.log
如果遇到网络问题,可以重启 dirmngr:
gpgconf --kill dirmngr
gpgconf --launch dirmngr
gpgsm
这个组件的作用是对 email 进行签名,遵循 S/MIME 规范。
gpgsm --sign --output signed-email.eml email.eml
gpg-connect-agent
可以通过 gpg-connect-agent 给 gpg-agent 发送命令。比如
(1) 重载 gpg-agent。 修改了 gpg-agent 的配置信息,我们可以给它发送一个重载命令,以便配置生效。
gpg-connect-agent reloadagent /bye
(2) 缓存某个 key 的 passphrase
echo "PRESET_PASSPHRASE <key-id> <your-passphrase>" | gpg-connect-agent
gpgv
验证签名,验证文档未被篡改。
gpgv signed-file.sig original-file
当我们从网站上下载了一个文件,我们不确定这个文件是不是被篡改过。我们就可以这样:
gpgv package.tar.gz.sig package.tar.gz
gpg-agent
这个是个 daemon。最常见的配置项是 cache ttl,我们可以在启动时指定选项:
gpg-agent --default-cache-ttl 600 --max-cache-ttl 7200
配置文件
最后,我们来看下各个组件的配置文件案列:
gpg.conf
# GPG Configuration File
keyserver hkp://keyserver.ubuntu.com
default-key ABCD1234
use-agent
compress-level 9
no-tty
gpg-agent.conf
# GPG Agent Configuration File
default-cache-ttl 600
max-cache-ttl 7200
pinentry-program /usr/bin/pinentry-gtk-2
enable-ssh-support
gpgsm.conf
# GPGSM Configuration File
keyserver hkp://keyserver.ubuntu.com
default-cert-digest-algo SHA256
use-agent
全文完!
如果你喜欢我的文章,请关注我的微信公众号 deliverit。