多个智能卡问题上的 GPG 加密子密钥

信息安全 加密 gnupg 智能卡 优比键
2021-08-14 21:39:49

有没有办法告诉 GPG,如果它需要解密某些东西,它可以在两张智能卡中的一张上找到私有加密密钥?

我的(简化的)设置如下:

  • 使用加密子密钥离线生成主密钥。
  • 将加密子密钥转移到 Yubikey 1。
  • 在 Yubikey 1 上,生成 auth 和 sign 子密钥。
  • 将加密子密钥转移到 Yubikey 2。
  • 在 Yubikey 2 上,生成 auth 和 sign 子密钥。

所以我只剩下:

gpg2 --list-keys
/Users/scott/.gnupg/pubring.gpg
-------------------------------
pub   3072R/600955C7 2016-09-09
uid       [ultimate] Scott Cariss 
uid       [ultimate] Scott Cariss (msn.com) 
uid       [ultimate] Scott Cariss (bigfish.co.uk)
uid       [ultimate] [jpeg image of size 12378]
sub   2048R/6FE6415F 2016-09-09
sub   2048R/D6DBBCAC 2016-09-09
sub   2048R/01A208C9 2016-09-09
sub   2048R/8D2A1368 2016-10-23
sub   2048R/65B08C5B 2016-10-23

我的加密子密钥在智能卡之间共享,并且在每个智能卡上都有单独的身份验证和签名密钥。

但是,当我来解密某些东西时,它总是会转到第一张智能卡,而不会在另一张智能卡上找到加密密钥。gpg-agent/pin 条目只会要求我插入正确的智能卡。


更新(解决方法)

正如已经回答的那样,这不是 GPG 支持的东西,但我找到了一个适合我的工作解决方案。

在 Mac OS XI 上,使用https://www.controlplaneapp.com/来检测我的一张智能卡(yubikeys)的到来并让它运行脚本:

#!/bin/bash
{
    killall -9 ssh-agent gpg-agent
    for keystub in $(/usr/local/MacGPG2/bin/gpg2 --with-keygrip --list-secret-keys {{EMAIL ADDRESS}} | grep Keygrip | awk '{print $3}'); do rm /Users/{{USERNAME}}/.gnupg/private-keys-v1.d/$keystub.key; done;
    /usr/local/MacGPG2/bin/gpg2 --card-status
    eval $(/usr/local/MacGPG2/bin/gpgconf --launch gpg-agent)
    ssh-add -l
} &> /Users/{{USERNAME}}/bin/gpg-card-change-log.txt

exit 0

由于密钥都处于离线状态,删除它们然后运行不会有任何害处,--card-status这会从当前插入的智能卡中引入密钥存根。

3个回答

我猜你会运气不好,这不受 GnuPG 支持。使用 OpenPGP 智能卡时,密钥环中存储了一个虚拟密钥,持有对存储它的智能卡的引用。密钥子包通过以下方式显示时如下所示gpg --list-packets

:secret sub key packet:
        version 4, algo 1, created 1358985314, expires 0
        pkey[0]: [2048 bits]
        pkey[1]: [17 bits]
        gnu-divert-to-card S2K, algo: 0, simple checksum, hash: 0
        serial-number:  01 23 45 67 89 ab cd ef 01 23 45 67 89 ab cd ef
        keyid: 9FF7E53ACB4BD3EE

查看代码,在我看来,支持的序列号不超过一个。

跑步

gpg-connect-agent "scd serialno" "learn --force" /再见

将为当前插入的密钥上的 PGP 密钥更新密钥存根。所以在插入密钥后运行它会导致 gpg 使用当前插入的密钥。

创建具有相同 PGP 密钥的备份 Yubikey

resetcard() {
  rm -rf ~/.gnupg/private-keys-v1.d
  killall -9 ssh-agent gpg-agent
}

我发现你是否删除了这个缓存的文件夹(我不是 100% 确定它的用途,但我认为它一定是某种密钥缓存??)然后重新启动代理它就可以正常工作了。希望我们不必这样做