据我了解,机器(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
命令行选项、使用IdentityFile
in~/.ssh/config
或 via 来完成ssh-agent
)。公钥在~/.ssh/authorized_keys
B 上。当您从 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 服务器上做很多工作(除了设置公钥之外,就像任何其他方法一样)已经讨论过了)。