gpg命令

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:列出密钥和用户 ID
  • adduid:添加新的用户 ID
  • deluid:删除用户 ID
  • addkey:添加子密钥
  • 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

解决方法:

  • 检查网络连接
  • 尝试不同的密钥服务器
  • 检查代理设置

安全最佳实践 #

  1. 使用强密钥(至少 4096 位 RSA 或 ED25519)
  2. 为主密钥设置合理的过期日期
  3. 使用子密钥进行日常操作,保持主密钥离线
  4. 定期轮换子密钥
  5. 使用强密码保护私钥
  6. 创建并安全存储吊销证书
  7. 验证密钥指纹以确保密钥的真实性
  8. 使用物理安全令牌(如 YubiKey)存储私钥
  9. 定期备份密钥
  10. 使用可信的密钥服务器

与其他工具的集成 #

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验证密钥的签名