gpg 命令 #
gpg
(GNU Privacy Guard)是一个加密和签名工具,它是 OpenPGP 标准的完整实现。GPG 可用于加密数据和通信、创建数字签名以及管理加密密钥,提供了强大的隐私保护和身份验证功能。
语法 #
gpg [选项] [文件]
常用选项 #
选项 | 描述 |
---|---|
--encrypt , -e |
加密数据 |
--decrypt , -d |
解密数据 |
--sign , -s |
签名数据 |
--verify |
验证签名 |
--clearsign |
创建明文签名 |
--detach-sign |
创建分离的签名 |
--armor , -a |
创建 ASCII 装甲输出 |
--recipient , -r |
指定接收者(用于加密) |
--local-user , -u |
指定用于签名的密钥 |
--output , -o |
指定输出文件 |
--gen-key |
生成新的密钥对 |
--full-gen-key |
生成新的密钥对(完整选项) |
--edit-key |
编辑密钥 |
--list-keys , -k |
列出公钥 |
--list-secret-keys , -K |
列出私钥 |
--delete-key |
删除公钥 |
--delete-secret-key |
删除私钥 |
--import |
导入密钥 |
--export |
导出密钥 |
--send-keys |
将密钥发送到密钥服务器 |
--recv-keys |
从密钥服务器接收密钥 |
--search-keys |
在密钥服务器上搜索密钥 |
--refresh-keys |
从密钥服务器更新所有密钥 |
--fingerprint |
显示密钥指纹 |
常见用法 #
密钥管理 #
1. 生成新的密钥对 #
gpg --gen-key
或者使用更详细的选项:
gpg --full-gen-key
2. 列出公钥 #
gpg --list-keys
3. 列出私钥 #
gpg --list-secret-keys
4. 导出公钥 #
gpg --export --armor [email protected] > public.key
5. 导出私钥(需谨慎保管) #
gpg --export-secret-keys --armor [email protected] > private.key
6. 导入密钥 #
gpg --import key.asc
7. 删除公钥 #
gpg --delete-key [email protected]
8. 删除私钥 #
gpg --delete-secret-key [email protected]
9. 编辑密钥 #
gpg --edit-key [email protected]
在交互式界面中,可以使用以下命令:
help
:显示帮助list
:列出密钥和用户 IDadduid
:添加新的用户 IDdeluid
:删除用户 IDaddkey
:添加子密钥expire
:更改密钥的过期日期passwd
:更改密码trust
:更改信任级别save
:保存更改并退出
10. 显示密钥指纹 #
gpg --fingerprint [email protected]
加密和解密 #
1. 加密文件(对单个接收者) #
gpg --encrypt --recipient [email protected] document.txt
这将创建document.txt.gpg
文件。
2. 加密文件(对多个接收者) #
gpg --encrypt --recipient [email protected] --recipient [email protected] document.txt
3. 加密并使用 ASCII 装甲(便于通过电子邮件发送) #
gpg --encrypt --armor --recipient [email protected] document.txt
这将创建document.txt.asc
文件。
4. 解密文件 #
gpg --decrypt document.txt.gpg > document.txt
或者:
gpg --output document.txt --decrypt document.txt.gpg
5. 对称加密(使用密码而不是密钥) #
gpg --symmetric document.txt
签名和验证 #
1. 签名文件 #
gpg --sign document.txt
这将创建document.txt.gpg
文件,包含原始内容和签名。
2. 创建明文签名 #
gpg --clearsign document.txt
这将创建document.txt.asc
文件,包含原始内容和可见的签名。
3. 创建分离的签名 #
gpg --detach-sign document.txt
这将创建document.txt.sig
文件,只包含签名。
4. 创建分离的 ASCII 装甲签名 #
gpg --detach-sign --armor document.txt
这将创建document.txt.asc
文件。
5. 验证签名 #
gpg --verify document.txt.asc
6. 验证分离的签名 #
gpg --verify document.txt.sig document.txt
密钥服务器操作 #
1. 将公钥发送到密钥服务器 #
gpg --send-keys KEY_ID
2. 从密钥服务器获取密钥 #
gpg --recv-keys KEY_ID
3. 在密钥服务器上搜索密钥 #
gpg --search-keys "user name or email"
4. 更新所有密钥 #
gpg --refresh-keys
5. 指定密钥服务器 #
gpg --keyserver hkps://keys.openpgp.org --recv-keys KEY_ID
高级用法 #
1. 加密和签名文件 #
gpg --encrypt --sign --recipient [email protected] document.txt
2. 验证并解密文件 #
gpg --decrypt document.txt.gpg
3. 创建吊销证书 #
gpg --output revoke.asc --gen-revoke [email protected]
4. 导出子密钥 #
gpg --export-secret-subkeys --armor subkey-id! > subkey.asc
5. 更改密钥的过期日期 #
gpg --edit-key [email protected]
然后在交互式界面中使用expire
命令。
6. 设置默认密钥 #
在~/.gnupg/gpg.conf
中添加:
default-key KEY_ID
7. 使用代理 #
在~/.gnupg/gpg.conf
中添加:
keyserver-options http-proxy=http://proxy.example.com:8080
8. 备份和恢复密钥环 #
# 备份
gpg --export --armor > public-keys.asc
gpg --export-secret-keys --armor > private-keys.asc
gpg --export-ownertrust > trust.txt
# 恢复
gpg --import public-keys.asc
gpg --import private-keys.asc
gpg --import-ownertrust trust.txt
配置文件 #
GPG 的主要配置文件和目录:
~/.gnupg/
:GPG 配置目录~/.gnupg/gpg.conf
:主配置文件~/.gnupg/trustdb.gpg
:信任数据库~/.gnupg/pubring.kbx
:公钥环(新版本)~/.gnupg/secring.gpg
:私钥环(旧版本)
常见问题排查 #
1. 找不到密钥 #
gpg: public key not found: KEY_ID
可能的原因:
- 密钥不在密钥环中
- 密钥 ID 输入错误
解决方法:
- 导入密钥
- 检查密钥 ID 是否正确
2. 密码错误 #
gpg: decryption failed: Bad passphrase
解决方法:
- 确保输入正确的密码
- 如果忘记密码,可能需要使用备份的私钥或吊销当前密钥
3. 信任问题 #
gpg: WARNING: This key is not certified with a trusted signature!
解决方法:
gpg --edit-key KEY_ID
然后使用trust
命令设置信任级别。
4. 密钥服务器连接问题 #
gpg: keyserver receive failed: No route to host
解决方法:
- 检查网络连接
- 尝试不同的密钥服务器
- 检查代理设置
安全最佳实践 #
- 使用强密钥(至少 4096 位 RSA 或 ED25519)
- 为主密钥设置合理的过期日期
- 使用子密钥进行日常操作,保持主密钥离线
- 定期轮换子密钥
- 使用强密码保护私钥
- 创建并安全存储吊销证书
- 验证密钥指纹以确保密钥的真实性
- 使用物理安全令牌(如 YubiKey)存储私钥
- 定期备份密钥
- 使用可信的密钥服务器
与其他工具的集成 #
1. 使用 GPG 代理 #
# 启动GPG代理
gpg-agent --daemon
# 在~/.bashrc中添加
export GPG_TTY=$(tty)
2. 与 Git 集成 #
# 配置Git使用GPG签名提交
git config --global user.signingkey KEY_ID
git config --global commit.gpgsign true
# 签名单个提交
git commit -S -m "Signed commit message"
# 签名标签
git tag -s tagname -m "Signed tag message"
3. 与电子邮件客户端集成 #
- Thunderbird:使用 Enigmail 插件
- Mutt:内置 GPG 支持
- Evolution:内置 GPG 支持
提示 #
- 使用
gpg --list-options show-unusable-subkeys --list-keys
可以显示已过期或已吊销的子密钥 - 使用
gpg --card-status
可以查看连接的智能卡或安全令牌的状态 - 使用
gpg --export-options export-minimal
可以导出更小的密钥 - 在脚本中使用 GPG 时,可以使用
--batch
和--passphrase-file
选项避免交互 - 使用
gpg --list-packets file.gpg
可以查看加密文件的详细信息 - 使用
gpg --with-colons --fingerprint
可以获取机器可读的输出格式 - 定期使用
gpg --check-signatures
验证密钥的签名