1. 为什么需要SSH密钥登录?
每次连接服务器都要输入密码,既麻烦又不安全。我在管理几十台服务器时,经常遇到以下痛点:
- 频繁输入复杂密码浪费时间
- 密码可能被暴力破解
- 不同服务器密码不同容易记混
SSH密钥认证完美解决了这些问题。它通过非对称加密实现身份验证,比密码更安全高效。实测配置完成后,连接服务器速度提升3倍以上,且完全无需记忆密码。
2. 密钥生成与配置全流程
2.1 生成密钥对
打开Windows终端(建议使用Windows Terminal),执行:
bash复制ssh-keygen -t ed25519 -C "your_email@example.com"
参数说明:
-t ed25519:使用更安全的EdDSA算法(比RSA更推荐)-C:添加注释方便识别
你会看到如下交互:
code复制Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\you/.ssh/id_ed25519): [直接回车]
Enter passphrase (empty for no passphrase): [建议设置密码]
重要提示:passphrase是为私钥再加一层保护,即使私钥泄露也无法直接使用
生成的文件:
id_ed25519:私钥(必须严格保密)id_ed25519.pub:公钥(上传到服务器)
2.2 配置SSH客户端
编辑~/.ssh/config文件(没有则新建):
config复制Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 60
配置说明:
AddKeysToAgent:自动加载密钥到ssh-agentServerAliveInterval:防止连接超时
启动ssh-agent服务:
powershell复制# PowerShell执行
Start-Service ssh-agent
Set-Service -Name ssh-agent -StartupType Automatic
添加私钥到agent:
bash复制ssh-add ~/.ssh/id_ed25519
3. 服务器端配置
3.1 上传公钥到服务器
使用以下命令一键上传(需要先密码登录一次):
bash复制ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
如果服务器没有ssh-copy-id命令,可以手动操作:
- 将公钥内容复制到剪贴板:
bash复制cat ~/.ssh/id_ed25519.pub | clip - 登录服务器,编辑
~/.ssh/authorized_keys文件 - 粘贴公钥内容并保存
3.2 服务器安全设置
修改服务器SSH配置(/etc/ssh/sshd_config):
config复制PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no # 禁用密码登录(确保密钥可用后再设置)
重启SSH服务:
bash复制sudo systemctl restart sshd
4. 多服务器管理技巧
4.1 使用config文件管理多个服务器
示例配置:
config复制Host dev
HostName 192.168.1.100
User devuser
Port 2222
IdentityFile ~/.ssh/dev_key
Host prod
HostName prod.example.com
User admin
IdentityFile ~/.ssh/prod_key
使用方式:
bash复制ssh dev # 等价于 ssh -p 2222 -i ~/.ssh/dev_key devuser@192.168.1.100
4.2 批量部署公钥
使用Ansible批量配置:
yaml复制- hosts: all
tasks:
- name: Add SSH key
ansible.posix.authorized_key:
user: "{{ ansible_user }}"
state: present
key: "{{ lookup('file', '~/.ssh/id_ed25519.pub') }}"
5. 安全增强措施
5.1 密钥存储安全
建议:
- 私钥权限设置为600:
bash复制chmod 600 ~/.ssh/id_ed25519 - 使用硬件安全模块(如YubiKey)存储密钥
- 定期轮换密钥(建议每6个月一次)
5.2 审计与监控
关键检查命令:
bash复制# 查看最近登录记录
lastlog
# 检查认证日志
sudo grep 'sshd' /var/log/auth.log
# 列出当前已授权密钥
cat ~/.ssh/authorized_keys
6. 故障排查指南
6.1 常见错误与解决
| 错误信息 | 原因分析 | 解决方案 |
|---|---|---|
| Permission denied (publickey) | 1. 公钥未正确安装 2. 文件权限错误 |
1. 检查authorized_keys内容 2. 运行 chmod 700 ~/.ssh |
| Could not open a connection to your authentication agent | ssh-agent未运行 | 执行eval $(ssh-agent -s) |
| Enter passphrase for key | 忘记了passphrase | 只能重新生成密钥对 |
6.2 调试模式
添加-v参数查看详细日志:
bash复制ssh -v user@host
典型调试流程:
- 确认客户端密钥路径正确
- 检查服务器端authorized_keys文件权限(应为600)
- 验证sshd配置中PubkeyAuthentication是否开启
7. 高级技巧
7.1 密钥代理转发
在config中添加:
config复制Host gateway
HostName jump.example.com
ForwardAgent yes
使用场景:通过跳板机连接内网服务器时,无需在内网服务器重复部署公钥。
7.2 证书认证(更安全的方案)
步骤:
- 创建CA密钥:
bash复制
ssh-keygen -t ed25519 -f ca_key - 签署用户证书:
bash复制
ssh-keygen -s ca_key -I user_id -n user id_ed25519.pub - 服务器配置信任该CA:
config复制TrustedUserCAKeys /etc/ssh/ca_key.pub
8. 我的实践心得
- 密钥管理:我使用1Password管理所有密钥的passphrase,既安全又方便
- 服务器分组:按环境(dev/stage/prod)使用不同密钥对,出问题时快速隔离
- 备用方案:即使禁用了密码登录,我也会在安全位置保留一个应急密钥
- 性能对比:Ed25519比RSA快30%以上,特别是频繁连接时差异明显
最后分享一个实用命令:用ssh -o "IdentitiesOnly=yes"强制使用指定密钥,避免自动尝试所有密钥导致延迟。