0%

ssh连接错误剖析

我们都知道SSH Server支持两种验证方式:密钥认证和账户密码认证

背景

之前碰到过一个问题,将虚拟机重装后(IP还是原来的IP),ssh重新连接到虚拟机发现出现如下图警告,并且无法连接,其实最简单的方法是删除~/.ssh/known_hosts中的第二行,重新连接即可输入密码进行连接。图片中的报错也有提到(Offending ECDSA key in ~/.ssh/known_hosts),之前解决了也没去想过为什么会这样,接下来我们通过SSH的工作方式来分析在这里为什么会发出警告,以及为什么要这么设计。

image-20240119143252927

SSH原理

我们都知道ssh客户端有两种认证方式,一是通过账号密码认证,二是通过私钥认证。接下来我们来看一下这两种认证的工作方式。

密码认证

下面有一些需要补充的地方:

  • 在客户端向服务端发送ssh连接请求时,已经将自己openssh版本、支持的加密算法等等信息发送给了服务端,服务端会进行协商从而选择发送什么加密算法的密钥(/etc/ssh中的密钥

  • 在第二步的时候,如果客户端是首次连接这个服务器,则终端会返回Are you sure you want to continue connecting (yes/no/[fingerprint])?信息,这个信息代表不确定这个服务器的真实性,需要用户自行判断,在键盘输入yes后,ssh会将服务端发来的公钥进行存储在~/.ssh/known.hosts中,代表已经信任该主机。下次连接同样的服务器时,验证公钥的真实性

  • 最后一步服务端验证密码正确性时所使用的私钥只有服务端才有,如果说在客户端发送加密密码的过程中被其他人截获,也无法得到明文密码

密钥认证

image-20240119143252927

总结

在了解了ssh工作原理之后,就知道前面的报错是为什么了

重装系统后,再次连接主机,当主机发送过来的公钥和本地~/.ssh/known.hosts中文件对比,发现远程主机的公钥发生了变化,断开了连接。为什么要这么设计,如果我们不验证公钥的一致性,使用这个新的公钥加密后,将加密后的密码发送过去时,这时候我们的密码就已经泄露了。

下面附上gpt的回答

Q:为什么会导致Remote Host IDENTIFICATION HAS CHANGED

A:”Remote Host Identification Has Changed”错误通常在你尝试连接到之前已经连接过的远程主机时发生。这个错误的原因是远程主机的身份信息发生了变化,与你之前连接时记录的身份信息不匹配。

SSH连接建立时,客户端会将远程主机的公钥保存在本地的”known_hosts”文件中,以便后续连接时进行验证。当你再次尝试连接时,客户端会比对远程主机的公钥与”known_hosts”文件中保存的公钥是否匹配,以确保连接的安全性。

当远程主机的公钥发生变化时,比如操作系统重新安装、SSH服务重新配置或者网络攻击等情况,客户端会检测到公钥不匹配的情况,从而引发”Remote Host Identification Has Changed”错误。

这个错误提示你远程主机的身份信息已经改变,可能存在安全风险。为了解决这个问题,你可以采取以下步骤之一:

  1. 更新”known_hosts”文件:如果你确定远程主机的身份信息确实发生了合理的变化(例如,你知道主机已经进行了重装或配置更改),可以手动更新”known_hosts”文件,删除对应远程主机的旧记录。下次连接时,客户端将会接受并保存新的公钥。

  2. 谨慎连接:如果你不确定远程主机的身份信息发生了何种变化,特别是在没有明确的原因或未知的网络状况下,建议谨慎连接。你可以联系远程主机的管理员或负责人,核实身份信息的变化,并确保连接的安全性。

需要注意的是,更新”known_hosts”文件或继续连接之前,请确保确认远程主机的身份信息是可信的,以保护你的连接安全。

参考

  1. SSH 原理和基本应用:https://zhuanlan.zhihu.com/p/241341815