如何理解 ssh-keygen 和 ssh-copy-id?

如何理解 ssh-keygen 和 ssh-copy-id?

据我了解,机器(A)ssh-keygen生成一个密钥,并将ssh-copy-id该密钥提供给另一台机器(B),是吗?

但是,完成此操作后,要测试是否完成,请使用 ssh,例如: root@A:ssh root@B 如果没有密码登录 B,则此操作有效。

我对此很困惑。 A给了B一个密钥,为什么A可以不用密码登录B?应该是这样的,登录B,Bssh A不用密码。

我的理解有错吗?

答案1

ssh 密钥有两部分,私有部分和公共部分。这就是为什么它通常被称为“密钥对”,即一对协同工作的密钥。

ssh-copy-id将私钥/公钥对的 PUBLIC 部分复制到~/.ssh/authorized_keys远程主机上。

拥有私钥(并且知道密码)的任何人都可以无需密码即可登录到该远程主机。

为了避免一直重新输入密码,您可以使用类似ssh-agent为您保存私钥的程序(简单来说,它会在您使用密码解锁后缓存私钥)。它会保留私钥,直到您告诉它不要这样做,或者您杀死代理,或者注销。看man ssh-agent

从安全角度来看,密钥对的 PUBLIC 部分并不是特别敏感。它可以毫无风险地分发和披露。如果没有匹配的私钥(以及私钥的密码),它几乎毫无用处。

当然,密钥对的私有部分应该保密。

答案2

您缺少的是,它ssh-copy-id不仅仅将公钥复制到 B:它还将公钥添加到允许访问帐户的密钥列表中 ( ~/.ssh/authorized_keys)。运行后ssh-copy-id,密钥不仅仅存储在 B 的某个地方,它还作为授权登录方法在 B 上注册。

私钥位于 A 上,需要传递给 SSH 客户端(这可以通过让它搜索~/.ssh/id_*、传递-i命令行选项、使用IdentityFilein~/.ssh/config或 via 来完成ssh-agent)。公钥在~/.ssh/authorized_keysB 上。当您从 A 登录 B 时,SSH 客户端会向 B 发送拥有私钥的证明; B 将该拥有证明与在中找到的公钥链接起来,~/.ssh/authorized_keys以便授权登录尝试。

答案3

A给了B一个密钥,为什么A可以不用密码登录B?

你说得对。

当 SSH 收到传入连接时,它可以通过多种方式对用户进行身份验证。这是可配置的。典型的方法是检查用户是否在 ~/.ssh/authorized_keys* 文件中拥有公钥,并接受匹配的私钥(假设所有详细信息都被接受,例如具有可接受权限的文件)。如果未设置密钥,或者 SSH 客户端无法提供可接受的详细信息来证明 SSH 客户端具有匹配的私钥,则 SSH 服务器将提示输入“密码”(或“密码短语”)。

ssh-copy-id 基本上是一个执行手动完成的任务并不困难的命令。它使用 SSH 连接到远程系统,并将公钥放入 ~/.ssh/authorized_keys* 文件中。

在学习如何使用 ssh-copy-id 后,我很快就忘记了,因为该程序对我来说并不是很有用,因为我已经学会了如何手动执行等效任务。不可否认,使用 ssh-copy-id 稍微容易/更快。然而,这是非常不必要的。我认为额外的便利是否值得花精力去学习另一个命令,这是值得怀疑的。

ssh-copy-id 可能要求用户输入密码,就像用户手动执行此操作时需要执行的操作(使用任何其他 SSH 客户端)一样。它不会规避正常的身份验证要求。

(当然,在 ssh-copy-id 完成它的工作之后,SSH 密钥就已安装并且可以轻松使用。)

应该是这样的,登录B,B ssh A,无需密码。

您可以登录 B(使用密码),然后使用 SSH(作为 shell,或使用 SSH 的协议,如 SCP/SFTP)从 A 获取密钥。是的,这也有效。是否需要密码取决于 A 的设置。如果A有公钥,B有相应的私钥,则B可能不需要输入密码。

卡斯的回答提到 ssh-agent (问题中未指定)。这基本上是另一种方法。 ssh-agent 存储私钥。它们可能已加密,因此您需要输入密码才能访问解密的私钥。当您使用 SSH 时,SSH 服务器将执行 ssh-agent 识别的操作,然后 ssh-agent 可以向 SSH 服务器提供所需的详细信息。这个想法是,一旦设置了 ssh-agent,在您输入一次密码(以解密对密钥的访问)后,您就可以整天建立不同的连接,而无需长时间重新输入密码当 ssh-agent 正在运行时。这主要是关于使用 SSH 客户端的最终用户的体验,因此您不需要在 SSH 服务器上做很多工作(除了设置公钥之外,就像任何其他方法一样)已经讨论过了)。

相关内容