使用智能卡时,GnuPG 无法找到用于签名的默认密钥,但我只有一个。我究竟做错了什么?

使用智能卡时,GnuPG 无法找到用于签名的默认密钥,但我只有一个。我究竟做错了什么?

我正在使用基于 Debian 的 Docker 映像,并且密钥环中只有一个可用密钥:

$ gpg -K
/tmp/test-keyring/pubring.kbx
-------------------------------
sec>  rsa2048 2012-01-16 [C] [expires: 2024-05-15]
      CB522FE0379DDF40A93400D7E4BC91FACDA9A65B
      Card serial no. = 00nn 00nnnnnn
uid           [ unknown] John Doe <[email protected]>
ssb#  rsa2048 2012-01-16 [S] [expires: 2024-05-14]
ssb   rsa3072 2012-01-16 [S] [expires: 2024-05-15]

正如您在这里看到的,共有三个键:

  • 标记为 的主密钥>驻留在智能卡上。它被标记为仅验证密钥,因此不能用于签名。
  • #此处不存在第二个辅助签名密钥的私有部分(标记为)。因此它不能用于签名。
  • 第三辅助签名密钥有一个可用的私有部分。这是这里唯一可用于签名的密钥。

同样,这里的最后一个密钥是唯一可用于签名目的的密钥。

唉,由于某种原因,GnuPG 无法看到它:

$ echo test | gpg --clearsign
gpg: no default secret key: Unusable public key
gpg: [stdin]: clear-sign failed: Unusable public key

但如果我直接指定用户 ID,签名就没有问题:

$ echo test | gpg --clearsign --default-key [email protected]
gpg: using "[email protected]" as default secret key for signing
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512

test
-----BEGIN PGP SIGNATURE-----

手册说它应该开箱即用:

--default-key name 使用 name 作为签名的默认用户 ID。如果未使用此选项,则默认用户 ID 是密钥环中找到的第一个用户 ID。

我正在使用 GnuPG 2.2.19:

$ gpg --version
gpg (GnuPG) 2.2.19
libgcrypt 1.8.5

我已经申请了一个已知的 Docker 解决方法GPG_TTY,无济于事。

我该怎么做才能让它发挥作用?

答案1

您可以 put或into来解决该问题。default-key [email protected]default-key CB522FE0379DDF40A93400D7E4BC91FACDA9A65B~/.gnupg/gpg.conf

答案2

如果我没看错的话:您有两个用于签名的子密钥,但其中一个处于离线状态:

ssb#  rsa2048 2012-01-16 [S] [expires: 2024-05-14]
ssb   rsa3072 2012-01-16 [S] [expires: 2024-05-15]

我希望ssb>在两者上看到:,这确认子项已被替换为存根。这可能就是 gnupg 感到困惑的原因。

来自同一来源:

# 表示该密钥的私钥根本不可用。离线主密钥就是这种情况。

我的设置是这样的,有 3 个用于签名、加密和身份验证的子密钥。请注意,所有 3 个子项都驻留在智能卡上:

sec#  rsa4096 2011-01-15 [C]
      xxxxxxxxxxxxxxxxxxxx
uid           [ unknown] xxxxxxxxxxxxx
ssb>  rsa4096 2011-01-15 [S]
ssb>  rsa4096 2011-01-15 [E]
ssb>  rsa4096 2011-01-15 [A]

我想知道当您尝试签名操作时智能卡是否在读卡器中。

答案3

如果我碰巧拔掉智能卡并重复签名操作,问题就会消失。这是一个 GnuPG 错误,看来它将在下一个版本中修复。

Dockerized 环境与此无关。

相关内容