客户端(计算机 3)确实有权访问公钥

客户端(计算机 3)确实有权访问公钥

我在计算机 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 服务器验证)它执行两步:

  1. 客户签署会话标识符(即:由早期生成的哈希值DH 密钥交换
  2. 然后服务器验证:
    • 指定的公钥是可接受的(在用户的授权密钥中)
    • 使用指定的公钥解密签名,生成会话标识符

为什么有些人对此感到困惑?

公私钥认证技术不需要客户端持有公钥。客户端只需要用私钥写一个签名即可。服务器只需要使用匹配的公钥来检查签名。

然而,SSH 允许客户端拥有多个私钥,而服务器则允许用户拥有多个授权密钥。如果客户端有 10 个密钥,服务器接受 10 个密钥,但只有一对匹配,则客户端将必须发送 10 个签名,而服务器将必须对照 10 个密钥检查每个签名(总共 100 个检查)。这在计算上是昂贵的。相反,SSH 只需进行一次签名检查即可处理相同的情况。

答案2

您的公钥仅用于验证私钥是否有效。

当您从本地计算机进行 ssh 并指向私钥进行身份验证时,远程计算机会创建质询。然后,您的本地计算机使用您的私钥对其进行加密,将质询发回。然后,服务器将使用您的公钥解密消息,只要质询有效,它就会允许连接。
你永远不应该分享你的私钥

在此输入图像描述

相关内容