SSH 公钥认证是一种比密码认证更安全、更便捷的身份验证方式。它基于非对称加密技术,使用一对密钥(公钥和私钥)进行身份验证。
公钥认证原理
-
密钥对生成:客户端生成一对密钥
- 私钥:保存在客户端本地,必须严格保密
- 公钥:上传到服务器,可以公开分享
-
认证流程:
- 客户端向服务器发起连接请求
- 服务器检查客户端的公钥是否在
~/.ssh/authorized_keys文件中 - 如果公钥存在,服务器生成一个随机挑战字符串
- 客户端使用私钥对挑战字符串进行签名
- 服务器使用对应的公钥验证签名
- 验证通过后,认证成功
密钥类型对比
| 算法 | 密钥长度 | 安全性 | 性能 | 兼容性 |
|---|---|---|---|---|
| RSA | 2048/4096 | 高 | 中 | 最好 |
| ECDSA | 256/384 | 高 | 快 | 良好 |
| Ed25519 | 256 | 极高 | 最快 | 较新 |
生成 SSH 密钥
bash# 生成 RSA 密钥 ssh-keygen -t rsa -b 4096 -C "your_email@example.com" # 生成 Ed25519 密钥(推荐) ssh-keygen -t ed25519 -C "your_email@example.com"
配置公钥认证
bash# 将公钥复制到服务器 ssh-copy-id user@hostname # 或手动复制 cat ~/.ssh/id_rsa.pub | ssh user@hostname "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
安全最佳实践
-
私钥保护:
- 设置强密码短语(passphrase)
- 设置正确的文件权限(600)
- 不要在多台设备间共享私钥
-
服务器配置:
- 禁用密码认证:
PasswordAuthentication no - 禁用 root 登录:
PermitRootLogin no - 限制登录用户:
AllowUsers username
- 禁用密码认证:
-
密钥管理:
- 定期轮换密钥
- 使用不同的密钥对管理不同服务器
- 及时撤销不再使用的公钥
优势
- 安全性:私钥不通过网络传输,难以被窃取
- 便捷性:无需每次输入密码
- 自动化:便于脚本和自动化工具使用
- 可审计性:可以追踪哪个密钥在何时登录
公钥认证已成为现代服务器管理的标准实践,特别适用于 DevOps 和自动化运维场景。