如何把服务器登录方法:从 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):放在服务器上,可以公开

认证过程大致是这样的:

  1. 你向服务器发起连接请求
  2. 服务器发回一段随机字符串作为挑战
  3. 你的电脑用私钥对这段字符串进行签名
  4. 服务器用公钥验证签名
  5. 验证通过后建立连接

整个过程不需要传输密码,即使有人监听网络也无法破解。

环境说明

  • 本地系统: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:不小心把自己锁在外面了

如果配置错误导致无法登录,不要慌:

通过云服务商控制台登录:

  1. 登录你的云服务商网站(阿里云、腾讯云、AWS 等)
  2. 找到你的服务器实例
  3. 使用 VNC 或控制台功能直接登录
  4. 修改 /etc/ssh/sshd_config,临时改回:
    PasswordAuthentication yes
    
  5. 重启 SSH 服务:sudo systemctl restart sshd
  6. 现在可以用密码登录了,重新配置密钥

这就是为什么配置前要保持一个 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 及更高版本

posted @ 2025-11-24 20:14  LexLuc  阅读(1)  评论(0)    收藏  举报