ssh 客户端会保存服务器的 ssh 公钥,下次连接时公钥出现了变化会提示的。
ssh 服务器的公钥是公开的,可以获得,但是服务器私钥是保密的。虽然没看过 ssh 的代码,但是客户端既然保存 ssh 服务器的公钥,那么建立连接时绝对会使用服务器的公钥加密握手数据,你没有服务器的私钥,无法解密握手数据,那么 ssh 连接就建立不起来...
查了一下资料,发现 ssh 设计时的安全性很好。即使客户端忽略了服务器公钥变化也无法做到透明的中间人攻击。证书登录时服务器会将一个随机数通过客户公钥加密后发送过来,客户端使用客户私钥解密,解密后不是直接发送到服务器认证身份,而是和 session id 做 MD5 后再发送到服务器认证身份。 session id 的产生依赖于服务器公钥,中间人的公钥和服务器的公钥是不相同的,造成客户端生成的认证数据中间人拿着也无法登陆真实的服务器认证。
可惜现在 md5 并不是很安全了,之前 md5 已经可以做到碰撞出相同的 md5 指纹了,破译出原文的难度就不清楚了。
参考资料:
http://erik-2-blog.logdown.com/posts/74081-ssh-principle