答案1
当您第一次通过 SSH 连接到服务器时,此警告是正常的。 SSH还不知道服务器的公钥,因此它会提示您是否应该认为它有效。除非您有理由怀疑您的连接被拦截或者您连接到了错误的服务器,否则您可以安全地接受它。您还可以要求您的托管提供商确认服务器的公钥,但这对我来说似乎有点过分了。
接下来,当您连接到同一台服务器时,SSH 将检查其公钥以确保其身份,并在密钥发生更改时向您发出警告,因为这可能意味着 MITM 攻击。 (实际上,更多情况下,这仅意味着系统管理员已为服务器生成了新的密钥对。)
另请注意,您的 ISP 没有给您密钥是正常的;如果您想设置 pubkey 身份验证(并删除基于密码的身份验证,这是一个好主意),您应该通过生成密钥对自己完成此操作。这样您将成为私钥的唯一所有者。
答案2
SSH 使用主机密钥来验证特定计算机为了确保您不是受害者中间人攻击。主机密钥通常是在计算机上安装 SSH 时自动生成的,因此如果重新安装计算机(或者由于某种原因管理员通过更改它ssh-keygen
),主机密钥可能会更改。
SSH 客户端将创建“已知”远程主机的本地数据库,其中存储属于哪台计算机的 SSH 主机密钥,其中计算机通过其 FQDN 或 IP 地址进行标识。在 Linux 中,这通常是.ssh/known_hosts
用户主目录中的文件;在 Windows 下,PuTTY将其存储在注册表项中。如果在联系时,远程主机提供的主机密钥与本地数据库中的条目不匹配,SSH 客户端将发出警告,以便您可以决定是否要继续联系该计算机(例如,因为您怀疑中间人攻击)。
现在,在第一次联系时,远程主机的主机密钥尚未存储在您的本地数据库中。因此,客户端无法知道该计算机是否实际上是“正确的计算机”。很可能是这样,因此它为您提供了一个选项来信任所提供的密钥并将其存储为该计算机的所有进一步连接的权威身份验证(如果您信任该主机...)。如果您知道由指纹识别的主机密钥,做对应您要连接的计算机,您可以单击“是”并将主机密钥存储在本地数据库中。对于所有进一步的连接,SSH 客户端将检查主机密钥是否仍然相同,如果是,则不会再发出警告。
真正“确定”主机密钥是否正确的唯一方法是联系托管提供商并要求他们告诉您计算机主机密钥的指纹。
正如 @Ginnungagap 在评论中指出的,有多种方法可以“发布”SSH 主机密钥,例如SSHFP 记录或者SSH 主机证书,但 PuTTY 最近才添加了对证书的支持,但对于 SSHFP 来说还没有。