一、SSH 免密登录的原理
SSH(Secure Shell)支持多种身份验证方式,其中最常用的是:
- 密码认证(Password Authentication)
- 公钥认证(Public Key Authentication)
免密登录的核心就是使用“公钥认证”机制,其原理如下:
- 在本地生成一对密钥:
- 私钥(
id_rsa):保存在本地,绝对不能泄露。 -
公钥(
id_rsa.pub):可以公开,用于分发。 -
将本地的公钥内容追加到远程服务器的
~/.ssh/authorized_keys文件中。 -
当你通过 SSH 连接远程服务器时:
- 服务器会检查
authorized_keys中是否有匹配的公钥; - 如果有,服务器会向客户端发起一个“请求”;
- 客户端使用私钥签名响应;
- 服务器用对应的公钥验证签名;
- 验证通过 → 免密登录成功。
✅ 简单理解:
authorized_keys文件就像是服务器的“白名单”,只有持有对应私钥的人才能通过验证。
此外,首次连接时,SSH 会将远程主机的指纹记录在本地的 ~/.ssh/known_hosts 文件中,防止中间人攻击。
二、配置步骤:从零开始设置 SSH 免密登录
第一步:本机安装并初始化 SSH
大多数 Linux 和 macOS 系统默认已安装 OpenSSH 客户端和服务端。如果未安装,可使用以下命令安装:
# Ubuntu/Debian
sudo apt update && sudo apt install openssh-client openssh-server -y
# CentOS/RHEL
sudo yum install openssh-clients openssh-server -y
生成 SSH 密钥对
运行以下命令生成 RSA 密钥(推荐使用更安全的 ed25519,见扩展建议):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa:指定密钥类型为 RSA;-b 4096:密钥长度为 4096 位(更安全);-C "...":添加注释(通常是邮箱),便于识别。
执行后,系统会提示:
- 保存路径(默认 ~/.ssh/id_rsa)
- 是否设置私钥密码(可选,增强安全性)
🔐 建议:生产环境建议为私钥设置密码(passphrase),防止私钥被盗用。
生成完成后,你会看到两个文件:
- ~/.ssh/id_rsa(私钥)
- ~/.ssh/id_rsa.pub(公钥)
第二步:上传公钥到远程服务器
有两种主流方式将公钥上传到目标服务器。
方法一:使用 ssh-copy-id(推荐)
这是最简单的方式,自动完成公钥上传和权限设置:
ssh-copy-id username@remote_host
# 示例
ssh-copy-id leon@192.168.1.2
系统会提示你输入一次远程用户的密码,之后公钥将被自动追加到 ~/.ssh/authorized_keys。
✅ 优点:自动处理目录和文件权限,避免常见错误。
方法二:手动上传(适用于无 ssh-copy-id 的环境)
如果目标系统没有安装 ssh-copy-id,可以手动操作:
# 1. 复制公钥到远程服务器
scp ~/.ssh/id_rsa.pub leon@192.168.1.2:~/id_rsa.pub
# 2. 登录远程服务器并追加公钥
ssh leon@192.168.1.2
# 在远程服务器上执行
mkdir -p ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
rm ~/id_rsa.pub # 清理临时文件
⚠️ 注意:
~/.ssh目录权限必须为700,authorized_keys文件权限必须为600,否则 SSH 会拒绝使用。
第三步:测试免密登录
配置完成后,尝试连接:
ssh leon@192.168.1.2
如果一切正常,你应该能直接登录,无需输入密码。
三、常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 仍需输入密码 | authorized_keys 权限错误 |
检查权限:chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys |
| 权限 denied (publickey) | SSH 服务未启用公钥认证 | 检查 /etc/ssh/sshd_config:PubkeyAuthentication yesAuthorizedKeysFile .ssh/authorized_keys |
| 连接被拒绝 | SSH 服务未运行 | sudo systemctl status sshd,确保服务启动 |
| 主机密钥变更警告 | 服务器重装或IP复用 | 删除本地 ~/.ssh/known_hosts 中对应行,或使用 ssh-keygen -R 192.168.1.2 |
四、安全建议
-
禁用密码登录(可选)
在确认密钥登录稳定后,可编辑/etc/ssh/sshd_config:conf PasswordAuthentication no重启 SSH 服务:sudo systemctl restart sshd -
使用更安全的密钥类型
推荐使用 Ed25519 替代 RSA:bash ssh-keygen -t ed25519 -C "your_email@example.com" -
定期轮换密钥
长期使用的密钥应定期更换,避免泄露风险。 -
保护私钥
- 不要将私钥上传到 GitHub 或共享设备;
- 使用
ssh-agent管理私钥,避免重复输入 passphrase。
五、进阶技巧
1. 配置 SSH Config 文件(简化连接)
编辑 ~/.ssh/config:
Host myserver
HostName 192.168.1.2
User leon
IdentityFile ~/.ssh/id_rsa
之后只需输入:
ssh myserver
2. 批量部署公钥
可结合 Ansible、Shell 脚本等方式批量部署公钥到多台服务器。
总结
SSH 免密登录不仅是提升效率的工具,更是实现自动化运维的基础。掌握其原理与配置方法,能让你在管理服务器时更加得心应手。
✅ 核心要点回顾: 1. 本地生成密钥对(私钥 + 公钥) 2. 公钥上传至远程
~/.ssh/authorized_keys3. 正确设置文件权限 4. 测试连接并排查常见问题
📌 一句话口诀:
本地生钥,公钥上传,权限设好,免密登船。
评论列表,共 0 条评论
暂无评论