如何将 SSH 公钥上传到现有的 VPS
SSH 公钥是一种加密凭证,存储在远程服务器的 ~/.ssh/authorized_keys 中,允许持有相应私钥的任何客户端获得访问权限——无需通过网络传输密码。将公钥上传到现有 VPS 可以用非对称加密替代或补充基于密码的身份验证,从而消除暴力破解和凭证填充攻击所利用的攻击面。
本指南涵盖整个流程的每个阶段:密钥生成、手动和自动上传方法、权限加固、sshd_config 调优、多密钥管理,以及即使是经验丰富的管理员也会遇到的常见故障模式。
为什么 SSH 密钥身份验证优于密码
在执行任何命令之前,了解加密机制是值得的。当您使用密钥对进行身份验证时,服务器会发出一个用您的公钥加密的挑战。只有持有匹配私钥的人才能解密并签署响应。没有任何秘密被传输——与密码身份验证形成对比,后者中凭证本身会通过网络传输(即使经过 TLS 封装)。
| 属性 | 密码身份验证 | SSH 密钥身份验证 |
|---|---|---|
| 通过网络传输的秘密 | 是(哈希/加密) | 从不 |
| 暴力破解抵抗力 | 低–中 | 极高(2048–4096 位) |
| 网络钓鱼风险 | 高 | 无(密钥从不被输入) |
| 自动化友好性 | 差(需要交互) | 优秀 |
| 多因素兼容性 | 有限 | 是(密钥 + 密码短语) |
| 撤销粒度 | 按账户更改密码 | 从 authorized_keys 中按密钥删除 |
| 审计追踪 | 仅登录日志 | 可按密钥识别 |
实际结论:在任何暴露于公共互联网的 VPS 托管环境中,SSH 密钥不是可选的加固措施——它们是基准要求。
前提条件
- 一个可通过 SSH 访问的现有 VPS(当前密码或现有密钥登录可用)
- 一台运行 Linux、macOS 或 Windows 且安装了 OpenSSH 或 PuTTY 的本地机器
- 在 VPS 上具有足够权限以写入目标用户主目录
- 对终端和文本编辑器(如
nano或vim)有基本的使用能力
第 1 步:生成 SSH 密钥对
如果您已在 ~/.ssh/id_ed25519 或 ~/.ssh/id_rsa 处有密钥对,请跳过此步骤。否则,现在生成一个。
选择正确的算法
| 算法 | 密钥大小 | 速度 | 安全级别 | 建议 |
|---|---|---|---|---|
ed25519 | 固定 256 位 | 最快 | 优秀 | 新部署首选 |
ecdsa | 256 / 384 / 521 位 | 快 | 良好 | 可接受的替代方案 |
rsa | 2048–4096 位 | 较慢 | 良好(4096 位) | 仅用于旧版兼容性 |
dsa | 1024 位 | 不适用 | 已破解 | 切勿使用 |
Ed25519 是现代标准。仅在连接不支持 Ed25519 的旧版服务器时才使用 RSA 4096。
生成 Ed25519 密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com"生成 RSA 4096 密钥对(旧版系统):
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"在密钥生成过程中,系统会提示您输入保存路径和可选的密码短语。对于大多数用户,接受默认路径(~/.ssh/id_ed25519)即可。务必设置密码短语——它使用 AES-256 加密磁盘上的私钥,因此笔记本电脑被盗不会自动意味着服务器被入侵。
该过程会生成两个文件:
~/.ssh/id_ed25519 — 您的私钥。切勿共享,切勿复制到服务器,切勿提交到版本控制。
~/.ssh/id_ed25519.pub — 您的公钥。可以自由分发。
显示公钥以便复制:
cat ~/.ssh/id_ed25519.pub
输出内容类似于:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... your_email@example.com
复制包括算法前缀和末尾注释在内的整个单行字符串。
第 2 步:登录您的 VPS
使用当前的身份验证方法连接到 VPS:
ssh root@your_vps_ip
将 your_vps_ip 替换为您服务器的实际 IPv4 或 IPv6 地址。如果您管理的是非 root 用户账户,请将 root 替换为相应的用户名。在可能有多个用户账户的独立服务器上,始终优先将密钥部署到非 root 用户,并使用 sudo 进行权限提升。
第 3 步:准备 .ssh 目录
登录后,验证或创建目标用户的 .ssh 目录:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
700 权限(rwx------)是强制性的。如果 .ssh 目录对组或其他用户可写,OpenSSH 将静默拒绝使用 authorized_keys。这是在其他设置正确后密钥身份验证失败的最常见原因之一。
第 4 步:将公钥添加到 authorized_keys
方法 A:手动粘贴(通用)
打开或创建 authorized_keys 文件:
nano ~/.ssh/authorized_keys
在新行上粘贴您的公钥。此文件中的每一行代表一个授权密钥。使用 Ctrl+X 保存,然后 Y,再 Enter。
设置正确的权限:
chmod 600 ~/.ssh/authorized_keys
600 权限(rw-------)确保只有文件所有者才能读取或写入它。OpenSSH 对此严格执行。
方法 B:ssh-copy-id(推荐用于快速部署)
如果您的本地机器上有 ssh-copy-id(Linux 和 macOS 上的标准工具),这个单一命令会自动处理目录创建、密钥追加和权限设置:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@your_vps_ip
系统会提示您输入一次当前 SSH 密码。之后,基于密钥的登录即可生效。-i 标志明确指定要上传哪个公钥,防止意外上传错误的密钥。
方法 C:通过 cat 和管道的单行命令(可脚本化)
在自动化管道中或当 ssh-copy-id 不可用时非常有用:
cat ~/.ssh/id_ed25519.pub | ssh root@your_vps_ip "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
这种方法在某种意义上是幂等安全的,因为它是追加而非覆盖,保留了任何现有的授权密钥。
第 5 步:验证正确的文件所有权
一个经常被忽视的陷阱:如果您在设置另一个用户账户时以 root 身份创建了 .ssh 目录或 authorized_keys 文件,所有权将会错误,SSH 将静默拒绝该密钥。
检查所有权:
ls -la ~/.ssh/
输出应显示目标用户名作为目录和文件的所有者和组:
drwx------ 2 alice alice 4096 Jan 15 10:00 .ssh
-rw------- 1 alice alice 571 Jan 15 10:00 .ssh/authorized_keys
如果所有权不正确,请修复它(以 root 身份运行):
chown -R alice:alice /home/alice/.ssh
第 6 步:测试 SSH 密钥登录
退出当前会话:
exit
使用明确的密钥指定重新连接以确认设置:
ssh -i ~/.ssh/id_ed25519 root@your_vps_ip
如果登录成功且没有密码提示(或仅提示输入本地密钥密码短语),则配置正确。如果仍然要求输入服务器密码,请继续阅读下面的故障排除部分。
第 7 步:加固 SSH 守护进程配置
一旦确认基于密钥的登录正常工作,请禁用密码身份验证,以完全消除密码暴力破解攻击向量。
打开 SSH 守护进程配置文件:
nano /etc/ssh/sshd_config
找到并设置以下指令。如果某行以 # 注释掉,请删除 # 并设置值:
PasswordAuthentication no
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin prohibit-password
ChallengeResponseAuthentication no
UsePAM yes
关于 PermitRootLogin prohibit-password 的说明:此设置允许仅通过密钥进行 root 登录,阻止基于密码的 root 访问,同时仍允许经过密钥身份验证的 root 会话。为了最大程度的加固,将其设置为 no 并使用带有 sudo 的非 root 用户。
在某些发行版上,辅助配置插件可能会覆盖您的设置。检查是否有覆盖:
grep -r "PasswordAuthentication" /etc/ssh/sshd_config.d/
如果该目录中的任何文件设置了 PasswordAuthentication yes,请编辑或删除它。
在重启之前验证配置语法:
sshd -t
干净的输出(无错误)意味着可以安全地重新加载。应用更改:
systemctl restart sshd
重要警告:在打开第二个终端并确认您仍然可以使用密钥登录之前,请勿关闭现有的 SSH 会话。在配置文件有误或密钥尚未生效的情况下重启 sshd 将会导致您被锁定。大多数 VPS 控制面板提供紧急控制台(KVM/VNC 访问)用于恢复,但最好完全避免这种情况。
第 8 步:使用 ~/.ssh/config 管理多个密钥和服务器
在管理多个服务器时——在暂存/生产环境中或管理多个独立服务器时很常见——SSH 客户端配置文件消除了记住 IP 地址、用户名和密钥路径的需要。
在您的本地机器上创建或编辑 ~/.ssh/config:
nano ~/.ssh/config
多主机配置示例:
Host production-vps
HostName 203.0.113.10
User deploy
IdentityFile ~/.ssh/id_ed25519
Port 22
Host staging-vps
HostName 203.0.113.20
User deploy
IdentityFile ~/.ssh/id_ed25519_staging
Port 2222
Host legacy-server
HostName 203.0.113.30
User admin
IdentityFile ~/.ssh/id_rsa_legacy
PubkeyAcceptedKeyTypes +ssh-rsa
为配置文件设置正确的权限:
chmod 600 ~/.ssh/config
现在您可以使用简洁的别名进行连接:
ssh production-vps
ssh staging-vps
旧版条目中的 PubkeyAcceptedKeyTypes +ssh-rsa 指令很重要:较新的 OpenSSH 客户端(8.8+)默认禁用 RSA-SHA1。没有此覆盖,连接到旧版服务器将失败,并出现神秘的”no matching host key type”错误。
故障排除:SSH 密钥身份验证失败的原因
即使设置正确,几个环境因素也可能导致密钥身份验证静默回退到密码提示:
.ssh 或 authorized_keys 的权限错误:
在服务器上运行 ls -la ~/.ssh/。目录必须是 700,文件必须是 600。任何更宽松的权限都会导致 OpenSSH 忽略该文件。
SELinux 或 AppArmor 上下文不匹配:
在启用 SELinux 强制模式的 RHEL/CentOS/AlmaLinux 系统上,authorized_keys 文件可能具有错误的安全上下文。使用以下命令恢复:
restorecon -Rv ~/.ssh
错误用户的主目录:
如果用户的主目录不是仅由所有者可写,SSH 将拒绝密钥身份验证。使用以下命令检查:
ls -ld ~
主目录本身不得对组或其他用户可写。
AuthorizedKeysFile 指令指向其他位置:
某些发行版将 AuthorizedKeysFile 配置为使用非标准路径(例如 /etc/ssh/authorized_keys/%u)。验证活动设置:
sshd -T | grep authorizedkeysfile
多个密钥和 ssh-agent 冲突:
如果 ssh-agent 正在运行并加载了多个密钥,服务器可能在尝试正确密钥之前因太多失败的密钥尝试而拒绝连接。使用 -i 明确指定密钥,或在 ~/.ssh/config 中配置 IdentitiesOnly yes。
防火墙或 fail2ban 封锁了您的 IP:
如果您之前多次登录尝试失败,fail2ban 或 ufw/iptables 规则可能已临时封禁您的 IP。使用以下命令检查:
fail2ban-client status sshd
轮换和撤销 SSH 密钥
密钥轮换是一种经常被忽视的安全卫生实践。要撤销特定密钥,请在服务器上打开 ~/.ssh/authorized_keys 并删除相应的行。每行是一个密钥——删除它会立即撤销该私钥持有者的访问权限,而不影响任何其他授权密钥。
出于审计目的,在每个密钥上使用不同的注释(密钥材料之后的部分,例如 alice@workstation-2024),以便您可以识别哪个密钥属于哪个人或设备。当员工离职或设备退役时,通过注释找到其密钥并将其删除。
要轮换您自己的密钥,请生成新的密钥对,将新公钥添加到 authorized_keys,验证使用新密钥登录有效,然后删除旧密钥条目。
实用关键要点清单
默认生成 Ed25519 密钥;仅在旧版服务器兼容性需要时使用 RSA 4096
始终用强密码短语保护您的私钥
尽可能使用 ssh-copy-id 进行快速、无错误的密钥部署
验证 .ssh 目录权限为 700,authorized_keys 为 600.ssh 和 authorized_keys 的所有权与目标用户匹配sshd -t 在重启守护进程之前验证配置语法PermitRootLogin prohibit-password;优先使用带有 sudo 用户的 no/etc/ssh/sshd_config.d/ 中可能覆盖您设置的插件文件~/.ssh/config 别名干净地管理多个服务器restorecon -Rv ~/.ssh常见问题
我可以向同一个 VPS 用户账户添加多个 SSH 公钥吗?
可以。~/.ssh/authorized_keys 中的每一行都是一个独立的授权密钥。每行添加一个密钥。这是授予多个管理员或多个设备访问权限的标准方法——每个人或设备持有唯一的私钥,撤销是按行进行的。
如果我在禁用密码身份验证后丢失了私钥会怎样?
您将被锁定在 SSH 之外。恢复需要使用您的托管提供商的带外控制台访问(KVM/VNC),这在大多数 VPS 托管控制面板中都可用。从控制台,在 /etc/ssh/sshd_config 中重新启用 PasswordAuthentication yes,重启 sshd,然后上传新密钥。这就是为什么在禁用密码之前测试密钥登录是不可妥协的。
Ed25519 在所有服务器上都受支持吗?
Ed25519 需要 OpenSSH 6.5 或更高版本(2014 年发布)。任何现代 Linux 发行版——Ubuntu 18.04+、Debian 9+、CentOS 7+、AlmaLinux 8+——都原生支持它。只有真正古老的系统才需要 RSA 回退。
我应该对我管理的每台服务器使用相同的 SSH 密钥对吗?
这在操作上很方便,但会造成单点泄露。更好的做法是每个角色或环境使用一个密钥对(例如,个人服务器一个密钥,客户基础设施一个密钥)。这样可以在私钥暴露时限制影响范围。
上传 SSH 密钥会影响我的 SSL 证书或 Web 服务器配置吗?
不会。SSH 密钥管理对操作系统的终端访问,与 Web 服务器(Apache、Nginx)用于 HTTPS 的 TLS/SSL 证书完全分离。它们使用不同的端口(22 对比 443)、不同的密钥格式和不同的信任链。更改其中一个对另一个没有任何影响。
