🔑 为什么 SSH 第一次连接会问你“Are you sure you want to continue connecting”
很多人第一次用 SSH 连服务器时,会看到一段有点吓人的提示:系统告诉你它拿到了对方的 public key fingerprint,问你要不要继续。这不是“多余的确认”,而是 SSH 整个安全模型里很关键的一步:它在防中间人攻击。
SSH 要解决的问题,不只是“把数据加密”,而是“我加密通信的对象,真的是那台我想连的机器吗”。如果没有身份校验,你确实能得到一条加密通道,但这条通道可能是加密连到了攻击者的机器上。SSH 的做法很直接:服务器先拿出自己的 host key,客户端把这个 key 记到
这就是为什么第一次连接时你会被要求确认。因为第一次还没有历史记录,客户端没法自动判断真假,只能把“是否信任这个 host key”的决定交给你。如果你确认了,以后只要 key 不变,SSH 就默认这是同一台机器;如果某天 key 突然变了,SSH 就会大声报警,因为这可能意味着两种事:服务器真的重装了,或者你正被中间人劫持。
这里的设计很实用。SSH 没有假装自己能在“第一次见面”时凭空知道对方是谁,它承认第一次信任必须从外部建立,这种模式叫 TOFU,Trust On First Use。它不完美,但在没有完整证书体系的小规模运维环境里很好用。问题也正出在这里:很多人第一次连接时根本不看 fingerprint,直接输入
真正容易踩坑的地方,是“REMOTE HOST IDENTIFICATION HAS CHANGED!” 这类报错。很多教程上来就让你删
🧪 课后一题:如果你第一次 SSH 到一台机器时,没有核对 host key fingerprint 就直接接受,之后
💡 易混淆点:SSH 的 host key 用来证明“服务器是谁”,和你登录时用的用户密钥不是一回事;前者校验远端身份,后者证明你是谁。
#CS
很多人第一次用 SSH 连服务器时,会看到一段有点吓人的提示:系统告诉你它拿到了对方的 public key fingerprint,问你要不要继续。这不是“多余的确认”,而是 SSH 整个安全模型里很关键的一步:它在防中间人攻击。
SSH 要解决的问题,不只是“把数据加密”,而是“我加密通信的对象,真的是那台我想连的机器吗”。如果没有身份校验,你确实能得到一条加密通道,但这条通道可能是加密连到了攻击者的机器上。SSH 的做法很直接:服务器先拿出自己的 host key,客户端把这个 key 记到
~/.ssh/known_hosts,以后每次再连,都会检查“这台机器现在给我的 key,和上次是不是同一个”。这就是为什么第一次连接时你会被要求确认。因为第一次还没有历史记录,客户端没法自动判断真假,只能把“是否信任这个 host key”的决定交给你。如果你确认了,以后只要 key 不变,SSH 就默认这是同一台机器;如果某天 key 突然变了,SSH 就会大声报警,因为这可能意味着两种事:服务器真的重装了,或者你正被中间人劫持。
这里的设计很实用。SSH 没有假装自己能在“第一次见面”时凭空知道对方是谁,它承认第一次信任必须从外部建立,这种模式叫 TOFU,Trust On First Use。它不完美,但在没有完整证书体系的小规模运维环境里很好用。问题也正出在这里:很多人第一次连接时根本不看 fingerprint,直接输入
yes,等于把最关键的一次校验草草跳过了。这样一来,TOFU 的安全性就被你自己抹掉了。真正容易踩坑的地方,是“REMOTE HOST IDENTIFICATION HAS CHANGED!” 这类报错。很多教程上来就让你删
known_hosts 重新连,这做法太粗暴。你应该先问:为什么变了?是不是服务器重装了?是不是换了 IP 后 DNS 还指向旧名字?是不是负载均衡后端机器的 host key 不一致?只有确认变化是合理的,才去更新记录;不然你就是在主动忽略一次安全警报。🧪 课后一题:如果你第一次 SSH 到一台机器时,没有核对 host key fingerprint 就直接接受,之后
known_hosts 里虽然有记录了,但这能不能保证你后续连接一定安全?💡 易混淆点:SSH 的 host key 用来证明“服务器是谁”,和你登录时用的用户密钥不是一回事;前者校验远端身份,后者证明你是谁。
#CS