什么是 SSH 密钥认证
SSH 密钥认证是一种使用公钥加密技术进行身份验证的方法,无需每次输入密码即可安全登录远程服务器。
传统密码登录 vs 密钥登录
特性 | 密码登录 | 密钥登录 |
安全性 | 中等(可能被暴力破解) | 高(几乎无法破解) |
便利性 | 每次需要输入密码 | 一次配置,永久免密 |
自动化 | 难以自动化脚本 | 可用于自动化任务 |
密钥长度 | 通常 8-16 字符 | 2048-4096 位或更长 |
工作原理
SSH 密钥认证使用非对称加密(也称公钥加密):
认证流程
- 客户端发起连接:向服务器发送登录请求
- 服务器发送挑战:生成一段随机数据
- 客户端用私钥签名:使用私钥对数据进行加密签名
- 服务器验证签名:用公钥尝试解密
- 验证成功:如果解密成功,证明客户端拥有对应的私钥,允许登录
关键点:
- 私钥永远不会传输,只在本地使用
- 即使有人截获通信数据,也无法伪造私钥
- 公钥可以公开,不会泄露任何安全信息
优势
1. 安全性更高
- 抗暴力破解:密钥长度远超密码(如 ED25519 是 256 位)
- 防中间人攻击:即使通信被截获也无法伪造身份
- 无密码泄露风险:没有密码可以被钓鱼或键盘记录窃取
2. 使用便捷
- 一次配置,永久使用
- 支持多台服务器使用同一密钥
- 可配合 SSH config 实现一键登录
3. 适合自动化
- 脚本可以自动 SSH 连接(无需交互输入密码)
- CI/CD 流程中的远程部署
- 定时任务的远程执行
完整配置步骤
前提条件
- 客户端已安装 SSH 客户端(Linux/macOS 自带,Windows 10+ 自带或使用 WSL)
- 服务器已安装并运行 SSH 服务器
- 有服务器的用户名和密码(首次配置需要)
步骤 1: 生成 SSH 密钥对
在客户端(你的电脑)上执行:
参数说明
t ed25519:指定密钥类型为 ED25519(推荐)- 其他选项:
rsa(传统,需要更长密钥)、ecdsa - ED25519 是最新、最安全、最快的算法
C "注释":添加注释标识这个密钥,通常用邮箱或描述- 示例:
C "work-laptop"或C "john@company.com"
交互提示
执行命令后会出现以下提示:
1. 保存位置
- 直接按 Enter:使用默认路径
~/.ssh/id_ed25519
- 或输入自定义路径(不推荐新手)
2. 设置密码(passphrase)
- 留空(直接按 Enter):实现完全免密登录
- 设置密码:额外一层保护,但每次使用密钥时需要输入(可用 ssh-agent 管理)
3. 确认密码
- 再次按 Enter(如果留空)或重复输入密码
生成结果
成功后会显示:
生成的文件:
~/.ssh/id_ed25519:私钥(🔑 绝密!不要分享)
~/.ssh/id_ed25519.pub:公钥(🔓 可以公开,复制到服务器)
步骤 2: 复制公钥到服务器
有三种方法,推荐方法 1(最简单)。
方法 1: 使用 ssh-copy-id(推荐)⭐
示例:
优点:
- 自动处理所有配置
- 自动设置正确的文件权限
- 避免手动错误
输入密码:这是最后一次需要输入密码,之后就免密了!
方法 2: 手动复制(如果没有 ssh-copy-id)
步骤 2.1:查看公钥内容
输出类似:
步骤 2.2:复制整行内容(包括
ssh-ed25519 开头和邮箱结尾)步骤 2.3:登录服务器
步骤 2.4:在服务器上执行
步骤 2.5:粘贴公钥内容,保存退出(Ctrl+O, Enter, Ctrl+X)
步骤 2.6:设置文件权限
步骤 2.7:退出服务器
方法 3: 一条命令完成(Linux/macOS)
输入密码后,配置完成。
步骤 3: 测试免密登录
成功标志:
- 不要求输入密码
- 直接登录到服务器
如果还要求密码,请查看故障排查部分。
高级配置
1. SSH Config 配置文件
创建或编辑
~/.ssh/config 文件可以简化 SSH 命令。基本配置
使用:
多服务器配置
常用配置选项
选项 | 说明 | 示例 |
Host | 别名 | Host myserver |
HostName | 实际主机地址 | HostName 192.168.1.100 |
User | 登录用户名 | User admin |
Port | SSH 端口 | Port 2222 |
IdentityFile | 指定私钥 | IdentityFile ~/.ssh/custom_key |
ServerAliveInterval | 保持连接(秒) | ServerAliveInterval 60 |
Compression | 启用压缩 | Compression yes |
ForwardAgent | SSH Agent 转发 | ForwardAgent yes |
设置文件权限:
2. 管理多个密钥
不同服务使用不同密钥(更安全):
生成不同密钥
在 config 中指定
3. 使用 SSH Agent(密钥有密码时)
如果你的私钥设置了密码(passphrase),每次使用都需要输入。使用 SSH Agent 可以只输入一次。
启动 SSH Agent
永久启动(添加到 .bashrc 或 .zshrc)
4. 为服务器配置多用户访问
如果多人需要访问同一服务器:
5. 跳板机配置(ProxyJump)
通过跳板机访问内网服务器:
使用:
故障排查
问题 1: 仍然要求输入密码
检查 1:公钥是否正确复制
在服务器上检查:
应该包含你的公钥内容。
检查 2:文件权限是否正确
应该显示:
检查 3:SELinux 问题(CentOS/RHEL)
检查 4:SSH 服务器配置
在服务器上检查
/etc/ssh/sshd_config:确保以下选项启用:
如果修改了配置,重启 SSH 服务:
检查 5:查看详细日志
在服务器上查看日志:
问题 2: Permission denied (publickey)
原因:服务器拒绝了密钥认证。
解决:
- 确认公钥已正确添加到服务器
- 检查文件权限(见上方)
- 确认使用了正确的私钥:
问题 3: Host key verification failed
原因:服务器的主机密钥改变了(可能是重装系统或 MITM 攻击)。
解决(确认安全后):
问题 4: 密钥文件权限问题
错误信息:
解决:
问题 5: 连接超时
检查:
- 服务器是否运行
- 防火墙是否开放 SSH 端口(默认 22)
- 网络是否畅通
安全建议
1. 保护私钥安全 🔒
- 永远不要分享私钥:私钥就像密码,只能自己知道
- 为私钥设置密码:即使电脑被盗,也无法使用密钥
- 备份私钥:存储在安全的位置(加密 U 盘、密码管理器)
- 定期更换密钥:建议每年或在设备更换时更换
2. 服务器安全配置
在服务器的
/etc/ssh/sshd_config 中:修改后重启服务:
3. 使用强密钥算法
推荐优先级:
- ED25519(最佳选择):
ssh-keygen -t ed25519
- RSA 4096:
ssh-keygen -t rsa -b 4096
- 避免:DSA(已废弃)、RSA 1024(不安全)
4. 限制 authorized_keys
在服务器的
~/.ssh/authorized_keys 中可以为每个密钥添加限制:5. 启用双因素认证(2FA)
安装 Google Authenticator PAM 模块:
6. 监控登录日志
定期检查异常登录:
7. 使用 fail2ban 防止暴力破解
常见使用场景
场景 1: GitHub/GitLab 密钥配置
添加:
测试:
场景 2: 自动化部署脚本
场景 3: 批量服务器管理
快速参考
常用命令速查
重要文件路径
权限要求
总结
SSH 密钥认证是一种安全、便捷、高效的远程登录方式:
✅ 优点:
- 无需记忆和输入密码
- 安全性远超密码认证
- 支持自动化脚本和批量操作
- 可以为不同服务使用不同密钥
⚠️ 注意事项:
- 妥善保管私钥,不要泄露
- 定期更新密钥
- 为私钥设置密码增加安全性
- 禁用服务器的密码登录
🎯 最佳实践:
- 使用 ED25519 算法
- 为私钥设置密码并使用 SSH Agent
- 配置 SSH config 简化使用
- 在服务器禁用密码认证
- 定期审计 authorized_keys
相关资源
- 作者:jiez
- 链接:https://blog.jiezcloud.com/article/2a3f38f9-0edd-8069-9ab8-d28b2e49cc0e
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
.jpg?table=collection&id=e0aa5e66-74d7-4301-9291-580a661bf93e&t=e0aa5e66-74d7-4301-9291-580a661bf93e&width=1080&cache=v2)
