能否配置GnuPG使其使用最后一个可用的子密钥?
解决GnuPG优先尝试未持有私钥的子密钥问题
我之前也踩过GnuPG这个子密钥选择的坑,结合你的情况(GnuPG 2.1.11,主密钥MMMMMMMM,子密钥AAAAAAAA和BBBBBBBB),给你几个靠谱的解决办法:
方法1:临时/永久指定默认子密钥
如果只是临时用一次,直接在命令里加--default-key参数指定要用的AAAAAAAA子密钥就行:
# 签名文件 gpg --default-key AAAAAAAA --sign your-file.txt # 加密文件 gpg --default-key AAAAAAAA --recipient target@example.com --encrypt your-file.txt
要是想一劳永逸,把这个配置写到~/.gnupg/gpg.conf里就行,以后所有操作都会默认用AAAAAAAA:
default-key AAAAAAAA
方法2:禁用不可用的子密钥(推荐)
GnuPG默认会优先选最后被签名的子密钥,哪怕你本地没有对应的私钥。你可以在持有主密钥MMMMMMMM的设备上,把BBBBBBBB子密钥设为禁用,这样所有设备都会自动 fallback 到可用的AAAAAAAA:
- 运行
gpg --edit-key MMMMMMMM进入密钥编辑界面 - 输入
key 1(这里的数字是子密钥的索引,你可以先输list查看,BBBBBBBB对应的索引就是要选的) - 输入
disable把这个子密钥禁用 - 输入
save保存修改,然后把更新后的公钥同步到只有AAAAAAAA私钥的设备上:
# 在主密钥设备上导出公钥 gpg --export MMMMMMMM > mmmmmm-updated.pub # 在目标设备上导入更新后的公钥 gpg --import mmmmmm-updated.pub
这个方法最省心,不用每次手动指定密钥,也不会影响其他设备的使用(只要其他设备有BBBBBBBB私钥,还是能正常用它)。
方法3:本地移除不可用的子密钥
如果不想修改全局公钥,也可以在只有AAAAAAAA私钥的设备上,把BBBBBBBB子密钥从本地密钥环里删掉:
- 先导出当前的公钥:
gpg --export MMMMMMMM > mmmmmm-original.pub - 用文本编辑器打开这个公钥文件,找到BBBBBBBB对应的密钥段(可以通过密钥ID识别),删掉这部分内容
- 先删除本地的MMMMMMMM密钥:
gpg --delete-key MMMMMMMM - 重新导入编辑后的公钥:
gpg --import mmmmmm-original.pub
不过这个方法有个小缺点:以后如果要同步公钥,得重复一遍这个操作,不如方法2方便。
最后提个小技巧:碰到子密钥相关的问题时,用gpg --list-secret-keys --keyid-format long可以清楚看到本地哪些私钥是可用的,方便排查问题。
内容的提问来源于stack exchange,提问作者ash
相关产品推荐
相关产品推荐

