SSH连接指纹校验是防御中间人攻击最直接有效的第一道防线,通过比对服务器公钥的SHA256哈希指纹(如SHA256:AbCdEf123456...)确认身份,首次连接须人工核对可信渠道获取的指纹,后续自动校验不一致即阻断连接。

SSH连接指纹校验是防御中间人攻击(MITM)最直接有效的第一道防线。它不依赖网络环境是否可信,而是靠验证“你连的到底是不是那台服务器”来切断伪造连接的可能性。
理解指纹的本质:公钥的唯一哈希标识
服务器每次启动SSH服务时,会生成一对长期密钥(如ed25519或ecdsa),其中公钥被客户端用来加密初始通信。但公钥本身太长(比如几百字节),不便人工比对。因此SSH将公钥做SHA256哈希,生成一串简短、唯一的指纹(如SHA256:AbCdEf123456...)。只要服务器没重装系统或手动更换密钥,这个指纹就固定不变。
关键点在于:攻击者可以冒充IP地址,但无法伪造出与真实服务器完全一致的私钥——因此也生成不出匹配的公钥指纹。
首次连接时必须人工核对指纹
当你第一次用ssh user@xxx.xxx连接一台新服务器时,SSH会显示类似这样的提示:
The authenticity of host '47.98.xxx.xxx' can't be established.
ED25519 key fingerprint is SHA256:AbCdEf123456...
Are you sure you want to continue connecting (yes/no/[fingerprint])?
这时不能直接输yes,而应:
- 通过独立可信渠道(如服务器控制台、云厂商后台、管理员邮件)获取该服务器当前真实的公钥指纹
- 逐字符比对屏幕上显示的指纹是否完全一致(注意大小写和冒号位置)
- 仅当确认无误后才输入
yes,让SSH把该指纹+公钥存入~/.ssh/known_hosts
后续连接自动比对,异常即阻断
一旦指纹被记录,每次重连时SSH会自动执行以下动作:
- 向目标服务器发起连接,接收其当前公钥
- 计算该公钥的SHA256指纹
- 查找
~/.ssh/known_hosts中对应主机的已存指纹 - 若两者不一致,立即中止连接,并报错:
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
这种不一致通常只有两种可能:服务器密钥确实更新了(如重装系统),或你正遭遇中间人攻击。此时切勿盲目删除known_hosts条目,先联系管理员确认变更是否合法。
增强可信度的实用补充手段
单靠本地比对仍有风险(比如你拿到的“官方指纹”本身已被篡改)。可叠加以下方式提升可靠性:
- 启用DNS SSHFP记录:在域名DNS中发布服务器公钥指纹(如
_sshfp.example.com IN SSHFP 4 2 xxxxx...),SSH客户端可通过VerifyHostKeyDNS yes选项自动查询并校验 - 在服务器Web界面或登录横幅中固定展示当前指纹,方便用户随时核对
- 使用
ssh-keygen -l -f /etc/ssh/ssh_host_ed25519_key.pub在服务端定期自查指纹,确保与对外公布的一致

















