GPG 使用指南

七月 18, 2025 [tools] #gpg #security #git #ssh #encryption

GPG 使用指南

基本操作

生成密钥

gpg --full-gen-key --expert

查看密钥

gpg -k          # 公钥
gpg -K          # 私钥
gpg --list-keys --with-keygrip
gpg --fingerprint <key-id>

导出/导入

# 导出公钥(文本格式)
gpg --armor --export peter > public.asc

# 导出私钥
gpg --armor --export-secret-key peter > private.asc

# 导入
gpg --import key.asc

签名操作

gpg --sign file.txt           # 签名后内嵌原文
gpg --clearsign file.txt      # 签名后原文可读
gpg --detach-sign file.txt    # 分离签名,生成 .sig 文件
gpg --verify file.txt.asc     # 验证签名

加密/解密

# 发送方使用接收方公钥加密
gpg -r <recipient> --encrypt file.txt

# 接收方使用自己的私钥解密
gpg --decrypt file.txt.asc > file.txt

同时签名和加密

gpg --local-user <sender> --recipient <receiver> --armor --sign --encrypt file.txt

信任网络

GPG 不依赖 PKI,而是通过"信任网"(Web of Trust)建立信任:

gpg --sign-key <key-id>   # 用自己的密钥签名对方的公钥
gpg --check-sigs          # 检查签名

子密钥管理

gpg --expert --edit-key peterxiao
  gpg> addkey             # 添加子密钥
  gpg> key 2              # 选择子密钥

最佳实践:生成主密钥后,导出备份到物理存储设备,然后从日常设备中删除主密钥仅保留子密钥:

gpg -a --export-secret-keys > master-secret-key.gpg
gpg -a --export-secret-subkeys > sub-secret-keys.gpg
gpg --delete-secret-key <key-id>
gpg --import sub-secret-keys.gpg

此时 gpg --list-secret-keys 会显示 sec#(主密钥已删除)。

Gnome Keyring 集成

SSH key 管理

apt install seahorse
# 首次 SSH 连接时提示输入 passphrase,可勾选"自动解锁"

Git 凭据

apt install libsecret
git config --global credential.helper /usr/lib/git-core/git-credential-libsecret

GnuPG 集成

echo 'pinentry-program /usr/bin/pinentry-gnome3' >> ~/.gnupg/gpg-agent.conf

使用 GPG 密钥进行 SSH 认证

用 GPG 密钥替代 SSH 密钥,减少需要管理的密钥文件。

echo enable-ssh-support >> ~/.gnupg/gpg-agent.conf

# 在 .bashrc 中设置
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
gpg-connect-agent updatestartuptty /bye >/dev/null

# 获取子密钥 keygrip
gpg --list-keys --with-keygrip

# 将 keygrip 添加到批准列表
echo <keygrip> >> ~/.gnupg/sshcontrol

# 查看已加载的 SSH 密钥
ssh-add -l

# 导出 SSH 公钥
gpg --export-ssh-key <key-id>

Git Tag 签名

git config --global user.signingkey <key-id>
git tag -s v1.0.0

Git 凭据管理

安装 Git Credential Manager 后配置:

# 使用 GPG 存储凭据
export GCM_CREDENTIAL_STORE=gpg

# 或使用内存缓存
export GCM_CREDENTIAL_STORE=cache

# 初始化密码存储
pass init <gpg-key-id>

在 Emacs 中需设置环境变量:(setenv "GCM_CREDENTIAL_STORE" "cache")

替代 apt-key

从 Ubuntu 22.04 起 apt-key 被弃用,改用 GPG:

# 旧方式(弃用)
wget -nc https://example.com/key.gpg
sudo apt-key add key.gpg

# 新方式
wget -O- https://example.com/key.gpg | gpg --dearmor | \
  sudo tee /etc/apt/trusted.gpg.d/example.gpg > /dev/null

# 更新 sources.list 添加 signed-by
deb [arch=amd64 signed-by=/etc/apt/trusted.gpg.d/example.gpg] https://example.com/debian stable main

迁移旧 apt-key 条目:

sudo apt-key list             # 查看所有旧 key
sudo apt-key export <key-id> | sudo gpg --dearmor -o /usr/share/keyrings/<name>.gpg
sudo apt-key del <key-id>     # 删除旧条目

常见问题