GPG 使用指南
七月 18, 2025 [tools] #gpg #security #git #ssh #encryptionGPG 使用指南
基本操作
生成密钥
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> # 删除旧条目
常见问题
- GPG 生成密钥时提示熵不够:SSH 远程服务器缺乏随机源,安装
rng-tools或在 GUI 环境下操作 - Emacs Magit 与 git credential 冲突:设置
magit-process-connection-type为 t,配置GCM_CREDENTIAL_STORE=cache