ssh 密钥和我的 Yubikey 之间的加密关系是什么?

ssh 密钥和我的 Yubikey 之间的加密关系是什么?

我很好奇,当我使用 Yubikey 添加额外的保护层时,生成的 ssh 私钥(和公钥)之间的加密关系是什么。

ssh-keygen 会将任何东西写入 Yubikey 本身吗?还是只是与其通信?如果可以写入,有什么限制?

有两种可能的算法具有安全密钥选项:Ed25519-SK 和 ecdsa-sk。据我所知,只要可能,建议使用 Ed25519-SK。

答案1

我很好奇,当我使用 Yubikey 添加额外的保护层时,生成的 ssh 私钥(和公钥)之间的加密关系是什么。

唯一普遍的是,私钥实际上永远不会向你透露。除非加载了其信息,否则该“私钥”文件无法使用回到 Yubikey,此时 Yubikey 将能够根据请求创建签名。

具体实施方式可能有所不同,因为并非所有 U2F“安全密钥”都是 Yubikeys,甚至 Yubikeys 也不需要以相同的方式执行;至少可以使用 3 种不同的机制来实现此结果。

ssh-keygen 是否会将任何内容写入 Yubikey 本身

生成时*-sk钥匙短的答案是“从技术上讲这要视情况而定,但实际上并非如此(除非你使用-O resident,在这种情况下是的)”。


理论上,U2F 令牌确实可以将所有这些密钥对存储在内存中,就像以前使用智能卡一样(比较 Yubikey 的“PIV”模式),但实际上令牌根本不需要任何可写内存就可以实现这一点。

即使使用相同的 U2F 令牌,每个网站也应该拥有不同的密钥,以防止用户跟踪。在生成 U2F 凭证期间,令牌会返回一个公钥和一个将由网站存储的“密钥句柄”——稍后在登录期间,该“密钥句柄”会从网站发送回令牌,以便它知道哪个用于此特定站点的密钥对。

(每当你运行 ssh-keygen 获取-sk密钥时,生成的id_*-sk私钥文件包含只有公钥和“密钥句柄”,与网站相同的信息。唯一的区别是,您将在所有 SSH 主机上共享相同的密钥对,而不是自动为每个服务器创建唯一的密钥对。)

诀窍在于,每个 Yubikey 令牌都有一个出厂时写入的 AES 密钥,每当它被要求生成新的 U2F 凭证时,它都会使用其内部 AES 密钥加密新的私钥并返回整个私钥作为网站的“密钥句柄”。然后,网站将完全忘记该密钥并等待下一个请求。

对于网站来说,这个“密钥句柄”是不透明的——它看起来就像一个很大的密钥 ID,并存储在常规数据库表中。但在登录期间,当网站将“密钥句柄”发送回令牌时,Yubikey 可以解密它并再次恢复相同的私钥——完成后,再次将其丢弃。

我认为这通常被称为“密钥包装”,它允许同一个令牌支持字面上的无限密钥对的数量。记录Yubikeys 使用此方法,但大多数其他 U2F/FIDO 令牌也使用这种方法。在 TPM2 芯片上生成密钥时也使用同样的技巧。

(还有另一种类似的方法,我记得我读过一家制造商在其 U2F 令牌上使用的方法:确定性密钥生成,其中令牌具有烧录的种子用于密钥生成,并使用类似于的东西Hash(seed || key_handle || AppID)以便每次从头开始为同一个网站生成相同的密钥。)

简而言之,使用 Yubikey 生成“ed25519-sk”密钥不会将任何内容写入其内部存储 - 所有必要的信息都以加密形式存储在您的私钥文件中,然后上传回 RAM 中的 Yubikey。

但还有一件事要提一下常驻密钥FIDO2 的功能。虽然最初的 U2F 只是作为附加因素,但 FIDO2 应该完全取代密码输入——事实上,其意图显然是让 FIDO2 令牌无需输入任何密码即可使用。任何根本沒有键盘输入。

为了实现这一点,FIDO2 令牌具有一定数量的密钥对(以及相应的用户名和 appID)的持久内存,但默认情况下不使用它 - 仅当应用程序明确请求“常驻”凭证时,密钥才会存储在令牌上。对于 OpenSSH,ssh-keygen 的-O resident选项将导致密钥对存储在令牌本身上,该-K选项允许将其下载回“id_whatever”文件中。


请注意,U2F/FIDO 完全独立于各种 Yubikey 型号中提供的 PIV 和 OpenPGP 智能卡模拟模式。这三种模式使用不同的工具和不同的协议。

在 PIV 模式下,可以使用 PIV 智能卡生成 ECP256 密钥对ykman,并通过 ssh 访问PKCS11Provider,并且它们写入 Yubikey 的内部存储器 - 不保留任何本地文件,PKCS#11 模块将根据需要从 Yubikey 检索所有内容。Yubikeys 模拟的 PIV 卡比大多数智能卡具有更严格的结构;我认为它可以容纳 3 个密钥对。当然,它们可以随时被擦除和重新生成。

同样,在 OpenPGP 模式下,gpg可以在 OpenPGP 智能卡上生成 ECP256 密钥对,并可用于 SSH gpg-agent– 这些密钥对也存储在 Yubikey 内部,尽管这次只存储了部分信息。整个私钥都保存在卡中,但gpg保留了 PGP 元数据和一个“存根”,提醒它相应的私钥在卡上。OpenPGP 卡总共可以容纳 3 个密钥对,但其中只有一个可用于 SSH。

相关内容