SSH 密钥配置与远程连接完全指南

SSH 密钥配置与远程连接完全指南

Someone Lv5

SSH(Secure Shell)是 Linux 服务器管理的核心工具。使用密码登录虽然简单,但存在暴力破解风险,且每次登录都需要输入密码。SSH 密钥认证方案不仅更安全,还能实现免密登录,是运维人员必须掌握的基础技能。

本文将带你从零开始,完成 SSH 密钥的生成、配置、部署和安全管理。

SSH 密钥认证原理

SSH 密钥认证基于非对称加密算法,核心是一对密钥:

  • 私钥(Private Key):保存在本地客户端,必须严格保密,相当于你的数字身份
  • 公钥(Public Key):部署到远程服务器,可以公开分发

当客户端发起 SSH 连接时,服务器用公钥加密一个随机数发送给客户端,客户端用私钥解密后返回给服务器验证。整个过程私钥不会在网络中传输,安全性远高于密码认证。

第一步:生成 SSH 密钥对

1.1 基本命令

在本地终端执行以下命令生成密钥对:

1
ssh-keygen -t ed25519 -C "your_email@example.com"

参数说明:

  • -t ed25519:指定密钥类型为 Ed25519(推荐,比 RSA 更安全、性能更好)
  • -C:添加注释,通常写邮箱地址,便于区分不同密钥

如果服务器不支持 Ed25519(如旧版 OpenSSH),可以退而使用 RSA:

1
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

1.2 执行过程

执行命令后,系统会交互式询问:

1
2
3
4
Generating public/private ed25519 key pair.
Enter file in which to save the key (~/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
  • 保存路径:直接回车使用默认路径 ~/.ssh/id_ed25519
  • 密码短语(passphrase):建议设置,私钥泄露时还能多一层保护

1.3 生成结果

生成后 ~/.ssh/ 目录下会出现两个文件:

文件 说明 安全要求
id_ed25519 私钥文件 严禁泄露,权限设为 600
id_ed25519.pub 公钥文件 可以安全分发,权限设为 644

第二步:部署公钥到服务器

方法一:ssh-copy-id(推荐)

最简便的方式,一行命令即可完成:

1
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@your_server_ip

首次连接会询问服务器密码,验证成功后公钥自动追加到服务器的 ~/.ssh/authorized_keys 文件中。

方法二:手动添加

如果服务器没有 ssh-copy-id 命令,可以手动操作:

在本地查看公钥内容:

1
cat ~/.ssh/id_ed25519.pub

输出类似:ssh-ed25519 AAAAC3... your_email@example.com

通过 SSH 登录服务器后执行:

1
2
3
4
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAAC3... your_email@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

权限设置非常重要.ssh 目录权限必须为 700authorized_keys 文件权限必须为 600,否则 SSH 服务可能会拒绝密钥认证。

第三步:测试密钥登录

在本地执行:

1
ssh user@your_server_ip

如果配置正确,将直接登录成功,无需输入密码。如果设置了 passphrase,SSH 会询问 passphrase。

常见问题排查:如果密钥认证失败,查看服务器日志:sudo tail -f /var/log/auth.log(Debian/Ubuntu)或 sudo journalctl -u sshd -n 50(systemd 系统)。

第四步:禁用密码登录(安全加固)

密钥认证验证无误后,可以禁用密码登录以防止暴力破解。

编辑 SSH 配置文件:

1
sudo vi /etc/ssh/sshd_config

修改以下配置项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 禁用密码登录
PasswordAuthentication no

# 禁用空密码登录
PermitEmptyPasswords no

# 禁用 root 密码登录(如果允许 root 登录)
PermitRootLogin prohibit-password

# 指定允许的认证方式
PubkeyAuthentication yes

# 指定公钥文件路径
AuthorizedKeysFile .ssh/authorized_keys

重启 SSH 服务使配置生效:

1
2
3
sudo systemctl restart sshd
# 或
sudo service ssh restart

注意:修改配置前请确保至少有一个终端保留了 SSH 连接,防止配置错误导致自己被锁在服务器外。

SSH 配置进阶技巧

1. 配置 SSH Config 文件

在本地 ~/.ssh/config 文件中为常用服务器配置别名和参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 博客服务器
Host blog
HostName 123.45.67.89
Port 22
User root
IdentityFile ~/.ssh/id_ed25519

# 开发服务器(自定义端口)
Host dev
HostName dev.example.com
Port 2222
User developer
IdentityFile ~/.ssh/id_ed25519_dev

配置后可以直接用别名登录:

1
2
ssh blog
ssh dev

2. SSH 代理转发(Agent Forwarding)

当你需要从服务器 A 连接到服务器 B 时,可以使用代理转发,避免在服务器上存放私钥:

1
ssh -A user@server_a

或者在 ~/.ssh/config 中为特定主机启用:

1
2
Host server_a
ForwardAgent yes

安全提示:仅在信任的服务器上启用代理转发,因为具有 root 权限的用户可能通过 Unix 域 Socket 偷用你的代理。

3. 使用 ssh-agent 管理私钥

ssh-agent 可以记住解密的私钥,避免反复输入 passphrase:

1
2
3
4
5
6
7
8
9
10
11
# 启动 ssh-agent(通常在登录 shell 时已自动启动)
eval "$(ssh-agent -s)"

# 添加私钥
ssh-add ~/.ssh/id_ed25519

# 查看已添加的密钥
ssh-add -l

# 删除所有密钥
ssh-add -D

4. 多密钥管理

如果你有多个 GitHub/GitLab 账号或不同的服务器,可以为不同场景生成专用密钥:

1
2
ssh-keygen -t ed25519 -C "work@company.com" -f ~/.ssh/id_ed25519_work
ssh-keygen -t ed25519 -C "personal@gmail.com" -f ~/.ssh/id_ed25519_personal

~/.ssh/config 中为不同域名指定不同的密钥:

1
2
3
4
5
6
7
Host github.com
HostName github.com
IdentityFile ~/.ssh/id_ed25519_personal

Host gitlab.company.com
HostName gitlab.company.com
IdentityFile ~/.ssh/id_ed25519_work

密钥安全管理最佳实践

✅ 应该做的

  • 私钥文件权限设置为 600(仅所有者可读写)
  • 定期更换密钥对(建议每 6-12 个月)
  • 服务器更换或弃用时及时从 authorized_keys 中移除对应公钥
  • 使用 SSH 证书认证作为更高级的替代方案(适合团队管理)

❌ 不应该做的

  • 不要将私钥上传到任何服务器
  • 不要在公开仓库中包含私钥
  • 不要将私钥通过不安全的通道传输(如未加密的邮件)
  • 不要共享私钥给他人

监控 SSH 登录记录

定期检查 SSH 登录日志,及时发现异常:

1
2
3
4
5
6
7
# Debian/Ubuntu
sudo lastlog
sudo last -f /var/log/auth.log | grep "Accepted"

# CentOS/RHEL
sudo lastlog
sudo journalctl -u sshd | grep "Accepted"

SSH 故障排除速查表

问题现象可能原因解决方案
Permission denied (publickey)未找到匹配的密钥或 authorized_keys 配置错误检查密钥是否已添加到 authorized_keys,检查文件权限
Connection refusedSSH 服务未运行或端口被防火墙阻止sudo systemctl restart sshd,检查防火墙规则
Connection timed out网络不通或 IP 地址错误ping 测试连通性,检查安全组/防火墙
Host key verification failed服务器主机密钥已变更(重装系统后常见)ssh-keygen -R hostname 清除旧密钥然后重连
Bad owner or permissions~/.ssh 或私钥文件权限错误chmod 700 ~/.ssh && chmod 600 ~/.ssh/id_ed25519

总结

SSH 密钥认证是 Linux 服务器管理的基石。通过本文的学习,你应该掌握了从密钥生成、公钥部署、免密登录到安全加固的完整流程。记住三个关键原则:

  1. 私钥永不离开本地
  2. 文件权限必须严格设置
  3. 修改 SSHD 配置前保留备用连接

掌握这些技能后,你就能安全高效地管理远程服务器了。


本文由AI辅助生成,内容仅供参考

  • 标题: SSH 密钥配置与远程连接完全指南
  • 作者: Someone
  • 创建于 : 2026-06-07 17:33:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-07-ssh-key-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。