使用YubiKey签名Git提交遇异常,求排查方案
问题原因及解决步骤
你的问题核心是导出密钥时误包含了子密钥的私钥,导致另一台电脑本地拥有签名私钥,无需依赖YubiKey即可完成签名。以下是具体分析和修复方案:
错误根源
迁移子密钥到YubiKey后,本地应仅保留主公钥的私钥(建议离线备份,日常不使用),子密钥的私钥应仅存储在YubiKey中,本地的子密钥私钥条目需被删除。但你在导出密钥时,大概率使用了导出私钥的命令(如gpg --export-secret-subkeys或gpg --export-secret-keys),导致子密钥私钥被导出并导入到另一台电脑,因此该设备无需YubiKey即可签名。
修复步骤
1. 验证原电脑的密钥状态
插入YubiKey,执行以下命令查看密钥详情:
gpg -K
- 正确状态:子密钥行以
ssb>开头(表示私钥存储在智能卡/YubiKey上),主公钥行若已离线备份则显示sec#(#表示私钥不在本地)。 - 若子密钥行仅显示
ssb(无>),说明本地仍保留子密钥私钥,需重新执行子密钥迁移步骤,迁移时务必确认删除本地私钥。
2. 重新导出纯公钥
在原电脑上,仅导出不含私钥的公钥文件:
gpg --export --armor <你的主密钥ID> > public-key.asc
该文件仅包含主公钥和子密钥的公钥部分,无任何私钥信息。
3. 清理另一台电脑的错误密钥
在目标电脑上:
- 列出本地密钥,找到需删除的私钥:
gpg -K - 删除本地的子密钥私钥(或整个密钥对):
# 删除子密钥私钥 gpg --delete-secret-keys <子密钥ID> # 若需彻底清理,再删除公钥 gpg --delete-keys <主密钥ID> - 重新导入正确的公钥文件:
gpg --import public-key.asc - 标记密钥为信任(可选但建议):
gpg --edit-key <主密钥ID> # 输入trust,选择5(ultimate trust),输入save退出
4. 配置目标电脑的Git与GPG
- 插入YubiKey,验证设备识别:
gpg --card-status - 配置Git使用YubiKey上的签名密钥:
git config --global user.signingkey <签名子密钥ID> git config --global commit.gpgsign true
完成上述操作后,目标电脑必须插入YubiKey才能执行签名操作,因为本地仅存储公钥,私钥仅存在于YubiKey中。
内容的提问来源于stack exchange,提问作者pepsilon
相关产品推荐
相关产品推荐

