如何把服务器登录方法:从 SSH 密码登录改为密钥对登录
TL;DR(太长不看版)
核心思想: 用密钥对(公钥+私钥)替代密码登录,公钥放服务器,私钥留本地,登录时加密验证,安全又方便。
快速操作步骤:
# 1. 本地生成密钥对
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/my_server_key
# 2. 上传公钥到服务器
ssh-copy-id -i ~/.ssh/my_server_key.pub username@your-server-ip
# 3. 测试密钥登录(应该不需要密码)
ssh -i ~/.ssh/my_server_key username@your-server-ip
# 4. 服务器上禁用密码登录
sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
sudo systemctl restart sshd
# 5. (可选)本地配置简化登录
cat >> ~/.ssh/config << EOF
Host myserver
HostName your-server-ip
User username
IdentityFile ~/.ssh/my_server_key
IdentitiesOnly yes
EOF
# 之后就可以直接用 ssh myserver 登录了
⚠️ 重要提醒: 禁用密码登录前,务必确认密钥登录能正常工作,否则会把自己锁在外面!
写在前面
很多人习惯用密码登录服务器,虽然方便,但安全风险不小:密码容易被暴力破解,一旦泄露后果严重。相比之下,SSH 密钥认证要安全得多。本文手把手教你配置 SSH 密钥登录,并彻底禁用密码认证,让服务器更安全。
SSH 密钥认证的工作原理
SSH 密钥认证基于非对称加密技术,包含一对密钥:
- 私钥(Private Key):存放在你的电脑上,必须妥善保管,不能泄露
- 公钥(Public Key):放在服务器上,可以公开
认证过程大致是这样的:
- 你向服务器发起连接请求
- 服务器发回一段随机字符串作为挑战
- 你的电脑用私钥对这段字符串进行签名
- 服务器用公钥验证签名
- 验证通过后建立连接
整个过程不需要传输密码,即使有人监听网络也无法破解。
环境说明
- 本地系统:Linux/macOS/Windows WSL
- 远程服务器:Ubuntu Server(其他 Linux 发行版类似)
- 服务器 IP:your-server-ip
- 登录用户:username
- SSH 配置文件:
/etc/ssh/sshd_config
配置步骤详解
第一步:生成 SSH 密钥对
在你的本地电脑上打开终端,执行:
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/my_server_key
命令解释:
-t ed25519:使用 ED25519 算法(比传统的 RSA 更安全、速度更快)-C "注释":添加注释信息,方便日后识别这个密钥的用途-f ~/.ssh/my_server_key:指定密钥文件的保存路径和名称
执行后会提示输入密码短语(passphrase):
Enter passphrase (empty for no passphrase):
这里有两种选择:
- 直接回车:不设密码,登录时无需输入任何密码(方便但稍微不那么安全)
- 输入密码:每次使用密钥时需要输入这个密码(更安全但稍微麻烦一点)
根据你的安全需求选择即可。一般来说,如果是个人电脑且磁盘有加密,不设密码也可以接受。
成功生成后会看到类似输出:
Generating public/private ed25519 key pair.
Your identification has been saved in ~/.ssh/my_server_key
Your public key has been saved in ~/.ssh/my_server_key.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com
这会在 ~/.ssh/ 目录下生成两个文件:
my_server_key(私钥,务必保密)my_server_key.pub(公钥,要上传到服务器)
第二步:查看公钥内容
cat ~/.ssh/my_server_key.pub
会输出类似这样的一长串字符:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your_email@example.com
第三步:将公钥上传到服务器
方法一:使用 ssh-copy-id(推荐)
这是最简单的方法,一条命令搞定:
ssh-copy-id -i ~/.ssh/my_server_key.pub username@your-server-ip
输入一次服务器密码,公钥就会自动添加到服务器的授权文件中。
方法二:手动上传
如果 ssh-copy-id 命令不可用,可以手动操作:
# 1. 先复制公钥内容(整行复制)
cat ~/.ssh/my_server_key.pub
# 2. SSH 登录到服务器
ssh username@your-server-ip
# 3. 在服务器上创建必要的目录和文件
mkdir -p ~/.ssh
chmod 700 ~/.ssh
# 4. 将公钥内容追加到授权文件(替换下面的公钥内容)
echo "ssh-ed25519 AAAAC3NzaC1... your_email@example.com" >> ~/.ssh/authorized_keys
# 5. 设置正确的权限
chmod 600 ~/.ssh/authorized_keys
# 6. 退出登录
exit
第四步:测试密钥登录
现在尝试使用密钥登录:
ssh -i ~/.ssh/my_server_key username@your-server-ip
如果一切正常,应该不需要输入密码就能直接登录进去了!
如果还是要求输入密码,说明配置有问题,需要排查一下(后面有常见问题排查部分)。
第五步:简化登录命令(可选但强烈推荐)
每次都要输入 -i ~/.ssh/my_server_key username@your-server-ip 太麻烦了。我们可以配置一个别名,以后直接输入简短的名字就能登录。
创建或编辑 ~/.ssh/config 文件:
nano ~/.ssh/config
添加以下内容:
Host myserver
HostName your-server-ip
User username
IdentityFile ~/.ssh/my_server_key
IdentitiesOnly yes
保存后设置权限:
chmod 600 ~/.ssh/config
现在你可以这样登录,超级简单:
ssh myserver
第六步:禁用密码登录(重要安全措施)
⚠️ 特别注意:
- 这一步之前,务必确认密钥登录已经正常工作
- 建议保持一个 SSH 会话不要断开,万一配置错了还能改回来
- 如果真的被锁在外面了,需要通过云服务商的控制台登录(后面会讲怎么办)
具体操作步骤:
1. SSH 登录到服务器
ssh username@your-server-ip
2. 先看看当前的 SSH 配置
sudo grep -E "PasswordAuthentication|PubkeyAuthentication" /etc/ssh/sshd_config
通常会看到:
#PubkeyAuthentication yes # 前面有 # 表示用的是默认值(yes)
PasswordAuthentication yes # 密码登录当前是开启的
3. 编辑 SSH 配置文件
sudo nano /etc/ssh/sshd_config
如果你习惯用 vim:
sudo vim /etc/ssh/sshd_config
4. 修改关键配置
找到文件末尾的 PasswordAuthentication yes,改成:
PasswordAuthentication no
完整的安全配置建议(可选):
# 禁用密码登录
PasswordAuthentication no
# 确保公钥认证开启
PubkeyAuthentication yes
# 禁止空密码
PermitEmptyPasswords no
# 禁止 root 直接登录(推荐)
PermitRootLogin no
# 禁用键盘交互认证
KbdInteractiveAuthentication no
5. 重启 SSH 服务使配置生效
sudo systemctl restart sshd
或者用:
sudo service ssh restart
6. 验证配置是否生效
千万别关掉当前的 SSH 连接! 新开一个终端窗口测试:
# 测试密钥登录(应该正常工作)
ssh -i ~/.ssh/my_server_key username@your-server-ip
# 测试密码登录(应该被拒绝)
ssh username@your-server-ip
如果密码登录被拒绝,出现类似提示:
username@your-server-ip: Permission denied (publickey).
恭喜!密码登录已成功禁用,你的服务器安全性大大提升了。
遇到问题怎么办?
问题 1:密钥登录一直失败
检查本地私钥权限:
chmod 600 ~/.ssh/my_server_key
chmod 644 ~/.ssh/my_server_key.pub
检查服务器端文件权限:
ssh username@your-server-ip
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
权限设置不对是最常见的问题,SSH 对权限要求很严格。
查看 SSH 连接的详细日志:
ssh -v -i ~/.ssh/my_server_key username@your-server-ip
加上 -v 参数可以看到详细的连接过程,有助于定位问题。
服务器端查看日志:
sudo tail -f /var/log/auth.log
一边尝试登录,一边看日志,通常能找到错误原因。
问题 2:不小心把自己锁在外面了
如果配置错误导致无法登录,不要慌:
通过云服务商控制台登录:
- 登录你的云服务商网站(阿里云、腾讯云、AWS 等)
- 找到你的服务器实例
- 使用 VNC 或控制台功能直接登录
- 修改
/etc/ssh/sshd_config,临时改回:PasswordAuthentication yes - 重启 SSH 服务:
sudo systemctl restart sshd - 现在可以用密码登录了,重新配置密钥
这就是为什么配置前要保持一个 SSH 会话不断开的原因!
问题 3:需要从多台电脑登录同一台服务器
有两种方案:
方案一:每台电脑生成独立密钥(推荐)
这是更安全的做法。在每台电脑上都生成一个密钥对,然后把所有公钥都添加到服务器:
# 服务器的 ~/.ssh/authorized_keys 文件可以包含多个公钥,一行一个
ssh-ed25519 AAAAC3... computer1@example.com
ssh-ed25519 BBBBC3... computer2@example.com
ssh-ed25519 CCCCC3... laptop@example.com
这样每台设备都有独立的密钥,哪台设备丢了就删除对应的那行公钥即可。
方案二:复制私钥(不推荐)
把同一个私钥复制到多台电脑上使用。虽然方便,但任何一台设备泄露都会影响所有设备的安全性,不建议这么做。
安全建议和最佳实践
私钥的妥善保管
- ✅ 私钥文件权限必须设为 600(
chmod 600 私钥文件) - ✅ 不要把私钥上传到 GitHub、网盘等地方
- ✅ 建议定期更换密钥(比如每年换一次)
- ✅ 最好给私钥设置密码短语,多一层保护
- ✅ 电脑磁盘最好开启加密(FileVault、BitLocker 等)
进一步加固 SSH 服务器
编辑 /etc/ssh/sshd_config,还可以做这些优化:
# 改用非默认端口(减少扫描和攻击)
Port 2222
# 禁止 root 直接登录
PermitRootLogin no
# 只允许特定用户登录
AllowUsers username1 username2
# 设置登录超时时间
LoginGraceTime 30
# 限制认证尝试次数
MaxAuthTries 3
# 如果不需要 X11 转发就关掉
X11Forwarding no
# 启用严格模式
StrictModes yes
改端口后登录需要指定端口:
ssh -p 2222 username@your-server-ip
配合防火墙使用
只允许特定 IP 访问 SSH 端口:
# 假设你的固定 IP 是 1.2.3.4
sudo ufw allow from 1.2.3.4 to any port 22
sudo ufw enable
安装 fail2ban 防止暴力破解:
sudo apt update
sudo apt install fail2ban
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
fail2ban 会自动监控登录失败的 IP,多次失败就会临时封禁。
常用命令速查表
# 生成新密钥
ssh-keygen -t ed25519 -C "注释" -f ~/.ssh/密钥名
# 上传公钥到服务器
ssh-copy-id -i ~/.ssh/公钥文件 username@server-ip
# 指定密钥登录
ssh -i ~/.ssh/私钥文件 username@server-ip
# 查看服务器上的授权公钥
ssh username@server-ip "cat ~/.ssh/authorized_keys"
# 测试 SSH 配置(不实际登录)
ssh -T username@server-ip
# 查看详细的连接过程(排查问题用)
ssh -v username@server-ip # 简单详细
ssh -vv username@server-ip # 更详细
ssh -vvv username@server-ip # 非常详细
# 修改服务器 SSH 端口后登录
ssh -p 端口号 username@server-ip
# 检查 SSH 配置文件语法是否正确
sudo sshd -t
写在最后
配置 SSH 密钥认证并禁用密码登录,能显著提升服务器的安全性:
- 有效防止暴力破解
- 不怕密码泄露
- 登录更方便(不用每次输密码)
- 方便写自动化脚本
整个过程其实不复杂,关键是小心谨慎,测试确认密钥登录正常后再禁用密码登录。建议第一次操作的时候慢慢来,每一步都验证一下,避免把自己锁在外面。
安全配置是一个持续的过程,定期检查和更新配置,保持安全意识,才能让服务器长期处于安全状态。
参考资料
已验证环境:OpenSSH 9.x, Ubuntu 20.04 及更高版本

浙公网安备 33010602011771号