![客户端的 ssh 私钥-公钥映射](https://linux22.com/image/114616/%E5%AE%A2%E6%88%B7%E7%AB%AF%E7%9A%84%20ssh%20%E7%A7%81%E9%92%A5-%E5%85%AC%E9%92%A5%E6%98%A0%E5%B0%84.png)
authorized_keys
在服务器和客户端之间的 ssh 通信中,客户端通过其私钥进行身份验证。我想知道,如果服务器的文件中有多于 1 个公钥,服务器如何知道哪个公钥属于客户端。
答案1
客户端发送其公钥 ID,服务器检查该密钥是否在 的列表中authorized_keys
。
客户端首先向服务器发送它想要进行身份验证的密钥对的 ID。
服务器检查客户端尝试登录的帐户的authorized_keys 文件中的密钥ID。
如果在文件中找到具有匹配 ID 的公钥,则服务器会生成一个随机数并使用该公钥对该数字进行加密。
服务器向客户端发送此加密消息。如果客户端确实拥有关联的私钥,则它将能够使用该密钥解密消息,从而揭示原始号码。
答案2
这在RFC4252包括客户端和服务器来回发送的消息:
- 第一条消息
SSH_MSG_USERAUTH_REQUEST
包含公钥 blob,用于与存储在中的密钥进行比较authorized_keys
- 服务器应答
SSH_MSG_USERAUTH_PK_OK
或失败 - 第二个
SSH_MSG_USERAUTH_REQUEST
再次包含公钥(假设它又是 blob)以及已知数据(包括公钥)的签名。
前两点不是强制性的,您只能执行最后一点(但探测使用哪个密钥可以节省计算能力)。