第二部分:GPG 操作指南-配置文件篇

728 阅读5分钟

介绍

上一篇文章介绍了 GPG 的核心概念,这篇文章着重介绍 GPG 的实战操作。 不过,在实战之前,我们需要先熟悉如何配置 GPG 工具,磨刀不误砍柴工。

1、安装

Linux 系统通常会自带,MacOS 我们可以使用 brew 来安装

brew install gpg

image.png

2、HOME 目录

image.png

~/.gnupg 目录结构:

image.png

我们可以把默认目录强制指定为 $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 格式。

image.png

~/.gnupg/ 目录中的这两个配置文件有不同的用途:

  1. 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
  1. 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.gpgpubring.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.lock pubring.kbx 的锁文件。
  • ~/.gnupg/secring.gpg GnuPG 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.gpg trustdb.gpg 是 GPG 的信任数据库文件,它存储了你对其他人的公钥的信任级别信息。具体来说:
  1. 它记录了:
  • 你对每个密钥的信任度评级
  • 密钥的有效性判断
  • 密钥所有者的身份验证状态
  1. 信任级别包括:
  • unknown (未知)
  • none (不信任)
  • marginal (部分信任)
  • full (完全信任)
  • ultimate (终极信任,通常只给自己的密钥)
  1. 查看信任数据库:
gpg --list-keys --with-trust-model=trust-db
  1. 编辑信任级别:
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 格式,

  1. 历史原因:
  • .kbx (keybox) 格式主要是为了替代密钥存储 (pubring.gpg/secring.gpg)
  • trustdb.gpg 的功能和结构与密钥存储不同,没有迁移的迫切需求
  1. 功能区别:
  • keybox 格式针对密钥管理进行了优化
  • trustdb 只存储简单的信任关系数据,原有格式已经足够
  1. 兼容性考虑:
  • 保持 trustdb.gpg 格式不变可以确保与旧版本 GnuPG 的兼容性
  • 不同 GnuPG 版本间可以更容易地共享信任数据

实际上,到目前为止 GnuPG 的开发团队也没有计划将 trustdb 迁移到 .kbx 格式,因为现有格式运作良好,没有明显的改进需求。

~/.gnupg 目录下有 S.dirmngr 和 S.keyboxd 两个 socket 文件,它们是干啥用的?

dirmngrkeyboxd 是 GnuPG 的两个守护进程,而这些 .S 文件是它们的 Unix domain sockets:

  1. S.dirmngr:
  • dirmngr 是证书和密钥管理守护进程
  • 负责与密钥服务器通信
  • 处理 CRL(证书吊销列表)和 OCSP(在线证书状态协议)请求
  • 通过这个 socket 文件与其他 GnuPG 组件通信
  1. 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

image.png

(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 的一个组件,主要负责网络相关的操作。启动方法:

  1. 直接启动:
dirmngr --daemon
  1. 通过 gpgconf 启动:
gpgconf --launch dirmngr

dirmngr 的主要功能:

  1. 密钥服务器通信
  • 处理密钥的查找
  • 处理密钥的获取
  • 处理密钥的上传
  1. 证书验证
  • 获取 CRL(证书吊销列表)
  • 处理 OCSP 请求
  • 验证 X.509 证书链
  1. 检查运行状态:
gpgconf --list-dirs dirmngr-socket  # 查看 socket 位置
gpgconf --status-of-socket dirmngr  # 检查状态
  1. 查看日志:
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-agentgpg-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。