免密登录的价值不只是省一次输入。
密码登录意味着服务器上有一个可以被反复尝试的口令。只要你开着 22 端口,每天都会有几十上百次撞库。密钥登录则把这件事变成数学问题:猜中的概率可以忽略。
配置只有三步,五分钟。
一、在本机生成一对密钥
Windows 用 PowerShell,Mac 和 Linux 用终端:
ssh-keygen -t ed25519 -C "你的备注"
一路回车即可。想要更稳妥,可以给密钥加一个口令(passphrase)——这样即使私钥文件被偷,没有口令也用不了。
生成两个文件:
id_ed25519—— 私钥,绝对不能给别人id_ed25519.pub—— 公钥,可以随便发
Windows 上默认在 C:\Users\你的用户名\.ssh\。
二、把公钥传到服务器
一条命令搞定:
ssh-copy-id -i ~/.ssh/id_ed25519.pub 用户名@服务器IP
Windows 没有 ssh-copy-id,用这个等价写法:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh 用户名@服务器IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
这一步会要求输一次密码,之后就再也不用了。
三、验证,然后关掉密码登录
先别急着关。新开一个终端窗口试一下:
ssh 用户名@服务器IP
能直接进去,说明密钥生效。然后才改服务器上的 /etc/ssh/sshd_config:
PasswordAuthentication no
PubkeyAuthentication yes
改完重启服务:
sudo systemctl restart ssh
顺序很重要:先验证密钥能登,再关密码。反过来操作,一旦密钥有问题,你就把自己锁在门外了——只能去云控制台走 VNC 救援。
几个容易踩的点
- 权限太开会导致密钥失效。
~/.ssh要 700,authorized_keys要 600。权限不对,sshd 会直接忽略这个文件,而且日志里只说「认证失败」,不说原因。 authorized_keys一行一个公钥,不能有换行断裂。复制时尤其注意别把一行折成两行。- 云主机的防火墙和安全组是两层。改 sshd 端口之后,安全组也要放行,否则连不上。
- 同一个公钥可以给多台机器用,私钥只留一份,别到处拷。
关于端口
把 22 改成别的端口,能挡掉绝大部分无差别扫描,但它不是安全措施,只是减少日志噪音。真正的安全来自:密钥登录 + 禁止 root 直接登录 + 及时更新系统。
我现在的做法是:只允许密钥、禁用密码、禁用 root 登录,端口没改——因为改了端口,每次连都得记一个数字,收益不值。
