我在计算机 1 中生成了密钥对。
并将公钥移至Computer2(服务器)并将其放入authorized_keys中。
并将私钥移至Computer3(客户端)并用于ssh-add
添加它。
为什么我不需要提供公钥就可以直接登录服务器? ssh密钥授权的真实流程是怎样的?
答案1
客户端(计算机 3)确实有权访问公钥
您可能混淆了私钥文件用私钥。
当您生成公钥/私钥对时,大多数实现都会创建一个包含私钥和公钥的私钥文件。为了方便起见,许多实现还将公钥单独写入文件。
根据RFC 4252 第 7 节公钥由客户端在身份验证期间提供。因此,您的客户必须拥有它。
使用 openssh,ssh-keygen
您可以从私钥文件中提取公钥:
ssh-keygen -y -f ~/.ssh/id_rsa
认证机制
https://www.rfc-editor.org/rfc/rfc4252#section-7
在客户端尝试登录之前,它可能首先检查一下什么是可以接受的。此检查可以包括发送与其可用私钥匹配的公钥,从而允许服务器指示要使用哪个公钥/私钥。
...签名操作涉及一些昂贵的计算。为了避免不必要的处理和用户交互,提供以下消息来查询是否可以接受使用“publickey”方法的身份验证。
byte SSH_MSG_USERAUTH_REQUEST string user name in ISO-10646 UTF-8 encoding [RFC3629] string service name in US-ASCII string "publickey" boolean FALSE string public key algorithm name string public key blob
然后它尝试登录
为了执行实际的身份验证,客户端可以发送
使用私钥生成的签名。客户端可以
直接发送签名,而不首先验证密钥是否
可接受。签名使用以下数据包发送:byte SSH_MSG_USERAUTH_REQUEST string user name string service name string "publickey" boolean TRUE string public key algorithm name string public key to be used for authentication string signature
请注意,这包括公钥和使用私钥生成的签名。公钥对于服务器SSH很有帮助,因为它有很多“授权密钥”;服务器不必针对每个签名进行测试。
与某些类似的算法不同,SSH 不使用质询-响应。这就对了不使用四步(1 客户端发起、2 服务器质询、3 客户端签名、4 服务器验证)它执行两步:
为什么有些人对此感到困惑?
公私钥认证技术不需要客户端持有公钥。客户端只需要用私钥写一个签名即可。服务器只需要使用匹配的公钥来检查签名。
然而,SSH 允许客户端拥有多个私钥,而服务器则允许用户拥有多个授权密钥。如果客户端有 10 个密钥,服务器接受 10 个密钥,但只有一对匹配,则客户端将必须发送 10 个签名,而服务器将必须对照 10 个密钥检查每个签名(总共 100 个检查)。这在计算上是昂贵的。相反,SSH 只需进行一次签名检查即可处理相同的情况。