SSH 免密登录配置详解:ssh-keygen 从入门到排错
每次登录服务器都要输一遍密码?写个自动化脚本还要在代码里塞密码?其实只需要 5 分钟配置一次 SSH 免密登录,之后所有登录、scp 传文件、git 推拉代码都能一劳永逸。本文从原理讲到排错,把最常见的坑一次说清。
一、原理:为什么能免密
SSH 免密登录基于非对称加密:你在本机生成一对密钥(私钥 + 公钥),把公钥放到服务器上。登录时服务器用公钥发起一个数学挑战,只有持有私钥的客户端才能正确应答,整个过程不传输私钥,也没有密码参与。
对应关系:私钥留在本机(~/.ssh/id_ed25519),公钥追加到服务器的 ~/.ssh/authorized_keys 文件中。
二、三步完成配置
1. 在本机生成密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车即可。相比老的 RSA,ed25519 密钥更短、更安全、生成更快。如果服务器较老不支持 ed25519,再用 rsa -b 4096。
2. 把公钥传到服务器
ssh-copy-id user@server_ip
这条命令本质上就是把 ~/.ssh/id_ed25519.pub 的内容追加到服务器的 ~/.ssh/authorized_keys,并自动修正权限。Windows 下没有 ssh-copy-id,可以用 PowerShell 一行代替:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@server_ip "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
3. 验证
ssh user@server_ip
不再提示输入密码即配置成功。
三、进阶:用 config 管理多台服务器
服务器多了以后,编辑 ~/.ssh/config(Windows 在 C:\Users\用户名\.ssh\config)给每台服务器起别名:
Host dev
HostName 192.168.1.100
User ubuntu
Port 2222
IdentityFile ~/.ssh/id_ed25519
Host prod
HostName 10.0.0.8
User root
IdentityFile ~/.ssh/id_prod
之后直接 ssh dev、scp ./a.log prod:/tmp/ 即可,端口、用户、密钥全自动带上,git 的远程地址也可以写成 git@dev:repo.git。
四、常见报错排查
1. 配置后仍提示输密码:九成是权限问题。SSH 对权限要求严格,在服务器上执行:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
家目录本身也不能是 777,否则 sshd 会拒绝读取 authorized_keys。
2. Permission denied (publickey):在客户端加 -v 看详细日志:ssh -v user@server_ip,重点看 Offering public key 和 Server accepts key 两行,确认尝试的密钥文件是否正确。
3. 刚改过服务器 sshd 配置:修改 /etc/ssh/sshd_config 后记得 systemctl restart sshd,并确认 PubkeyAuthentication yes 和 AuthorizedKeysFile %h/.ssh/authorized_keys 两项没有被注释。
4. SELinux 造成的失败(CentOS 常见):执行 restorecon -Rv ~/.ssh 修正安全上下文。
五、小结
免密登录不只是省去输密码:它比密码更安全(密钥无法被暴力破解)、更适合自动化(脚本和 CI 不需要嵌入密码)。建议顺手做好两件事:给私钥设置 passphrase(ssh-keygen -p),以及在服务器上关闭密码登录(PasswordAuthentication no),安全性再上一个台阶。
如果在华为云 ECS 上配置,注意在安全组中放行 22 端口,并使用弹性公网 IP 连接。遇到问题欢迎评论区交流。
- 点赞
- 收藏
- 关注作者
评论(0)