前往 OpenSSH 代码库
为了与确认用户存在的设备进行交互,OpenSSH 中添加了一种新型密钥”[电子邮件保护]”(“ecdsa-sk”),它使用带有 NIST P-256 椭圆曲线和 SHA-256 哈希的 ECDSA(椭圆曲线数字签名算法)数字签名算法。 与令牌交互的过程放置在中间库中,该中间库的加载方式与支持 PKCS#11 的库类似,并且是库顶部的包装器
要启用 U2F,您可以使用来自的新代码库片段
Libfido2 支持 OpenBSD、Linux、macOS 和 Windows。
要验证并生成密钥,您需要设置 SSH_SK_PROVIDER 环境变量,在其中指示 libsk-libfido2.so 的路径(导出 SSH_SK_PROVIDER=/path/to/libsk-libfido2.so),或者通过 SecurityKeyProvider 定义库设置,然后运行“ssh-keygen -t ecdsa-sk”,或者,如果密钥已创建并配置,则使用“ssh”连接到服务器。 当您运行 ssh-keygen 时,生成的密钥对将保存在“~/.ssh/id_ecdsa_sk”中,并且可以像其他密钥一样使用。
应将公钥 (id_ecdsa_sk.pub) 复制到服务器的authorized_keys 文件中。 服务器端只验证数字签名,客户端与token交互(服务器端不需要安装libsk-libfido2,但服务器端必须支持“ecdsa-sk”密钥类型) 。 生成的私钥(id_ecdsa_sk)本质上是一个密钥句柄,只有与存储在U2F令牌侧的秘密序列结合才能形成真正的密钥。
如果 id_ecdsa_sk 密钥落入攻击者手中,为了通过身份验证,他还需要获得对硬件令牌的访问权限,否则存储在 id_ecdsa_sk 文件中的私钥将毫无用处。 另外,默认情况下,当使用密钥执行任何操作时(无论是在生成期间还是在认证期间),都需要本地确认用户的物理存在,例如,建议触摸令牌上的传感器,这使得很难使用连接的令牌对系统进行远程攻击。 作为另一道防线,还可以在 ssh-keygen 的启动阶段指定密码来访问密钥文件。
U2F 密钥可以通过“ssh-add ~/.ssh/id_ecdsa_sk”添加到 ssh-agent,但 ssh-agent 必须构建为支持“ecdsa-sk”密钥,libsk-libfido2 层必须存在并且代理必须在令牌所连接的系统上运行。
由于存在附加字段,OpenSSH ecdsa 密钥的格式与 ECDSA 数字签名的 U2F 格式不同,因此添加了新的密钥类型“ecdsa-sk”。
来源: opennet.ru