SSH密钥登录是否不受中间人(MiTM)攻击?请求解析登录步骤与原理
嘿,咱们先把你的问题拆解开,一步步说清楚:
一、“SSH密钥登录不受MiTM攻击”的说法准确吗?
答案是不完全绝对,但抗性远高于密码登录。
SSH密钥登录并非完全免疫中间人攻击,但它的设计让攻击成功的难度极大——只有在你第一次连接陌生服务器,且未核对主机指纹就盲目信任的情况下,才有可能被MiTM攻击得逞。而后续连接时,因为你的本地设备已经存储了服务器的合法主机指纹,一旦中间人伪造服务器身份,SSH会立刻触发严重警告,阻止你登录。
二、SSH密钥登录的具体步骤
我给你梳理最常用的标准流程,操作起来很简单:
1. 本地生成密钥对
首先在你的本地机器上生成一对非对称密钥:一个必须严格保密的私钥,和一个可以安全共享的公钥。推荐用安全性更高的ed25519算法,执行命令:
ssh-keygen -t ed25519
执行后会提示你设置密钥存储路径(默认~/.ssh/id_ed25519即可),还可以设置一个密钥密码(passphrase)——这是额外的保护层,就算私钥不慎泄露,没有这个密码也无法使用。
2. 将公钥上传到目标服务器
有两种常用方式:
- 自动上传(推荐):用
ssh-copy-id工具一键完成,它会自动把公钥添加到服务器的authorized_keys文件,还会帮你设置正确的权限(权限错误会导致SSH拒绝登录):ssh-copy-id your_username@server_ip_address - 手动上传:如果没有
ssh-copy-id,可以手动操作:- 查看本地公钥内容:
cat ~/.ssh/id_ed25519.pub,复制输出的全部内容; - 用密码登录服务器,创建
.ssh目录(如果不存在):mkdir -p ~/.ssh; - 将复制的公钥内容追加到
authorized_keys文件:echo "复制的公钥内容" >> ~/.ssh/authorized_keys; - 设置正确权限:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
- 查看本地公钥内容:
3. 测试密钥登录
完成以上步骤后,直接用SSH命令登录,不需要输入服务器密码:
ssh your_username@server_ip_address
如果之前设置了密钥密码,会提示你输入一次,之后就能成功登录了。
三、为什么SSH密钥登录不易遭受MiTM攻击?
核心原因有两个,咱们逐个说:
1. 主机指纹的信任校验机制
当你第一次连接服务器时,SSH会显示服务器的主机指纹(比如ED25519 key fingerprint is SHA256:xxxxxx...),并询问你是否信任这台主机。如果你通过安全渠道(比如服务器提供商的后台、线下运维人员)核对过指纹,确认无误后选择信任,这个指纹就会被存储到本地的~/.ssh/known_hosts文件中。
后续每次连接时,SSH会自动对比服务器返回的指纹和本地存储的指纹:
- 如果一致,正常登录;
- 如果不一致,SSH会弹出红色的警告,直接阻止你登录——这时候你就知道大概率遇到了中间人攻击,不会再继续连接。
2. 基于非对称加密的认证逻辑
密钥登录的认证流程从根本上杜绝了中间人伪造身份的可能:
- 当你发起登录请求,服务器会发送一个随机字符串给你的本地客户端;
- 客户端用自己的私钥对这个随机字符串进行签名,然后把签名发回服务器;
- 服务器用你之前上传的公钥验证这个签名:只有私钥对应的公钥才能验证通过;
- 验证通过后,服务器允许你登录。
中间人就算截获了这个随机字符串,也没有你的私钥,根本无法生成有效的签名——就算冒充服务器,也过不了认证这一关,自然无法劫持你的登录会话。
内容的提问来源于stack exchange,提问作者joven

