15%

全场主机优惠15%

测试技能,享折扣

使用代码:

Skills
开始使用
22.10.2024
5 +2

如何将 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 上具有足够权限以写入目标用户主目录
  • 对终端和文本编辑器(如 nanovim)有基本的使用能力

第 1 步:生成 SSH 密钥对

如果您已在 ~/.ssh/id_ed25519~/.ssh/id_rsa 处有密钥对,请跳过此步骤。否则,现在生成一个。

选择正确的算法

算法密钥大小速度安全级别建议
ed25519固定 256 位最快优秀新部署首选
ecdsa256 / 384 / 521 位良好可接受的替代方案
rsa2048–4096 位较慢良好(4096 位)仅用于旧版兼容性
dsa1024 位不适用已破解切勿使用

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
  • 确认 .sshauthorized_keys 的所有权与目标用户匹配
  • 在禁用密码身份验证之前,在第二个终端中测试密钥登录
  • 运行 sshd -t 在重启守护进程之前验证配置语法
  • 最低设置 PermitRootLogin prohibit-password;优先使用带有 sudo 用户的 no
  • 检查 /etc/ssh/sshd_config.d/ 中可能覆盖您设置的插件文件
  • 使用 ~/.ssh/config 别名干净地管理多个服务器
  • 定期审计和轮换密钥;在人员或设备变更时立即撤销
  • 在 SELinux 系统上,任何手动文件操作后运行 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)、不同的密钥格式和不同的信任链。更改其中一个对另一个没有任何影响。

    15%

    全场主机优惠15%

    测试技能,享折扣

    使用代码:

    Skills
    开始使用