手把手搞定 SSH 用户认证:从杂毛到身份认同的“硬功夫” 想象一下你刚进公司,手里只有一把解锁钥匙(私钥)。老板是个资深的技术老手,平时总爱用密码墙要么指纹锁。你绝对不能直接把钥匙塞进去,那忒冒险了,万一老板换了新锁如何办?得先注册个新身份,拿到一张新的通用钥匙(公钥),然后把这些新钥匙分批发给不同部门的人,大家互相确认,最终那把大钥匙才真正归你。

这就是 SSH 用户认证的核心逻辑:你拥有公钥,但权限是由公钥持有人设定的。 大量新手一上来就想着自己搞定身份,结局发现成了“杂毛”。

为啥?出于他们搞不定那个叫“密钥指纹”的玩意儿。别小看这几个数字,它们就像是证书的指纹,一旦变了,你的旧钥匙就失效了。登录时,SSH 会随机拉几个随机数(Nonce),把这些数据和你的公钥一起传那会儿,管理员实时比对指纹。

要是指纹对得上,人设就稳了;对不上,直接踢出,连个屁说都没用。 大量人当作只要公钥都在,就能进得去。

实际上不然,得看公钥持有人。假设你有个哥们儿 Alice,她给你发了一个公钥,但她的公钥在某个老旧的旧版 SSH 客户端里,而你目前用的是新版客户端,这就尴尬了。新版客户端不认识旧公钥,连点头都懒得转,直接把你刷出去了。

这就是典型的“公钥持有人”理论。 解决这个难题的关键,就是使用 `ssh-keygen -E` 命令。

这个命令能把你的公钥转换成一种无形的“指纹编码”。啥意思?就是当你两边都用这个编码讲话时,不管哪位发的文件,只要指纹对得上,就能互认。想象一下,两边都发了身份证,但身份证上都印着不同的数字,这时候就不存有“是不是我”的难题了,只有“是不是我这张身份证”的难题。 具体操作时,打开终端,输入 `ssh-keygen -E` 即可。屏幕上会弹出一个动态生成的十六进制字符串,这就是你的编码。记得把这段字符串记在手机备忘录里,别让它丢了。后续甭管是复制公钥还是推送公钥,都只需替换掉原字符串里的 `YOUR_PUBLIC_KEY`. 这局部一般是固定的,后面跟着你的编码。 有个细节好办被忽略,就是不要用 `ssh-agent` 存公钥。你认定自己是个高手,把公钥放进环境变量,当作系统能自动帮你管理?大错特错。`ssh-agent` 是帮你管理密钥对的工具,它不会替你管理公钥本身。公钥一旦部署到服务器,就得自己扛着走。

要是公钥被恶意工具(比如某个脚本)传走了,你的身份瞬间就没了。

故此,部署完公钥,最好就让它快乐滚蛋。 再说说公钥如何发给那个老板(服务器管理员)。别直接发私钥,那是大忌,相当于把家门钥匙扔给陌生人。务必走“公钥分发”流程。用 `ssh-copy-id` 命令是最省事的方式。

打个比方,你有个盒子装着公钥,把盒子给管理员;管理员拿到盒子,把自己手里的钥匙(公钥)拿出来,装进盒子;最终管理员把盒子里的钥匙和原公钥发给服务器,服务器就拥有了管理这个盒子的权力。 执行 `ssh-copy-id -v username@server`,它会强制你确认密码。

这一步挺关键,务必确认密码,否则服务器会当作你在干坏事,直接回绝访问。

要是你急着去干活,能够用 `ssh-copy-id -P username@server`,这样就不用二次确认了,但前提是服务器管理员已经配置好了授权。 还有一种情况,就是你在本地机器上想给自己发公钥,却忘了重启 SSH 服务。

这时候得手动重启 SSHD,要么重启整个系统。

要是你没做这一步,SSH 服务当作你的公钥是坏的,故此连公钥都收不到,自然也就连不上本地的 SSH 端口,更别提登服务器了。 最终,别忘了清理垃圾。SSH 的权限管理是动态的,服务器管理员可能会调整你的权限,比如把你从 root 降级到一般/平平用户,要么反过来把你提权。

这时候你的公钥就得跟着变,要么得重新部署。

这时候的清理工作就主要是删除本地的 `~/.ssh/authorized_keys` 文件,确保没有残留的旧权限。 总而言之,记住这几点:公钥是身份,不是权限;编码要永恒;分发要谨慎;服务得重启。别指望单纯靠“智慧”就能搞定认证,硬碰硬,把公钥和编码都理顺了,那把锁才算真正打开。