中文

Windows 上的 SSH 密钥:内置 OpenSSH 与 ed25519

1 min
VPS/VDS 主机

密钥对比密码安全得多:私钥永远不会离开你的电脑,扫描 22 端口的机器人也无法猜出它。Windows 10 和 11 已内置 OpenSSH,因此你可以创建密钥,安装到你的 VPS Linux Infrawire 上,让它常驻 Windows 的 ssh-agent 服务,最后关闭密码登录。

📋 前提条件

  • 带 OpenSSH 客户端的 Windows 10 或 11(在 PowerShell 中用 ssh -V 检查)。
  • 一台仍可用密码登录的 Linux VPS(Ubuntu 24.04、Debian 12、AlmaLinux 9 或 Rocky 9):在客户中心即可找到 VPS 的 IP 和 root 密码。
  • 大约十分钟,并准备好第二个 SSH 会话或 VPS 控制台作为保险。
PowerShell
ssh -V

🔐 生成 ed25519 密钥

打开 PowerShell(普通窗口,不是管理员)并运行:

PowerShell
ssh-keygen -t ed25519 -C 'USER@my-pc'

接受默认路径 C:\Users\USER\.ssh\id_ed25519,并设置一个密码短语。它会在磁盘上加密私钥,所以文件被盗也无法使用。系统会生成两个文件:id_ed25519(私钥,切勿分享)和 id_ed25519.pub(公钥)。

📤 把公钥复制到 VPS

Windows 没有 ssh-copy-id,所以要手动安装密钥。先显示公钥并复制整行内容:

PowerShell
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub

用密码登录,然后在服务器上追加这一行(把单引号之间的示例文本替换为你的真实密钥):

Bash
ssh root@VPS_IP mkdir -p ~/.ssh && chmod 700 ~/.ssh echo 'ssh-ed25519 AAAA...your-key... USER@my-pc' >> ~/.ssh/authorized_keys sed -i 's/\r$//' ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys

sed 这一行会去掉可能让密钥无法读取的 Windows 换行符。不要为此使用 PowerShell 管道把内容传给 ssh:Windows PowerShell 5.1 可能给数据加上回车符。

🧰 在 Windows 上启用 ssh-agent

没有代理时,每次登录都要输入密码短语。ssh-agent 服务已安装,但默认处于禁用或手动启动状态。在管理员 PowerShell 中运行:

PowerShell
Get-Service ssh-agent | Set-Service -StartupType Automatic Start-Service ssh-agent Get-Service ssh-agent

然后在普通 PowerShell 中一次性加载密钥,并列出已加载的密钥:

PowerShell
ssh-add $env:USERPROFILE\.ssh\id_ed25519 ssh-add -l

代理会在重启后保留该密钥,之后不会再询问。

✅ 测试密钥登录

再次连接。你应当直接进入命令行,服务器不再询问 root 密码:

PowerShell
ssh root@VPS_IP

要确切查看使用的是哪种方式,加上 -v,并查找 Server accepts key 和 Authenticated to ... using publickey:

PowerShell
ssh -v root@VPS_IP

在这一步成功之前不要继续,并保持此会话打开。

🚫 在服务器上禁用密码认证

在 Ubuntu 和 Debian 上,/etc/ssh/sshd_config.d/ 里可能已有启用密码的文件(例如 50-cloud-init.conf)。SSH 采用最先读到的值,所以要创建一个排序更靠前的文件。在 VPS 上以 root 运行:

Bash
grep -ri 'PasswordAuthentication' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ cat > /etc/ssh/sshd_config.d/10-keys-only.conf <<'EOF' PasswordAuthentication no KbdInteractiveAuthentication no PubkeyAuthentication yes PermitRootLogin prohibit-password EOF sshd -t && systemctl reload ssh

在 AlmaLinux/Rocky 上服务名为 sshd,请使用 systemctl reload sshd。确认主 sshd_config 靠前位置包含 Include /etc/ssh/sshd_config.d/*.conf 这一行(默认如此)。语法正确时 sshd -t 不会输出任何内容。

在新窗口中确认密码现在被拒绝,而密钥仍然可用:

PowerShell
ssh -o PubkeyAuthentication=no root@VPS_IP

预期的回应是 Permission denied (publickey)。

🛠️ 故障排查

Permission denied (publickey)。 密钥不在正确账户的 authorized_keys 中、被粘贴成了多行,或权限不对。在服务器上运行 chmod 700 ~/.ssh 和 chmod 600 ~/.ssh/authorized_keys,并检查该行以 ssh-ed25519 开头。

WARNING: UNPROTECTED PRIVATE KEY FILE。 其他 Windows 账户可以读取你的私钥。请把权限限制为只有你的用户:

PowerShell
icacls $env:USERPROFILE\.ssh\id_ed25519 /inheritance:r /grant:r "${env:USERNAME}:F"

Error connecting to agent: No such file or directory。 ssh-agent 服务没有运行,请按上文所示启动它。

修改后被锁在外面。 通过客户中心使用 VPS 控制台,删除 /etc/ssh/sshd_config.d/10-keys-only.conf,运行 sshd -t 并重新加载 SSH 服务。


🚀 现在你的 Windows 电脑用 ed25519 密钥登录 VPS,密码登录已关闭。请把私钥的备份保存在安全的地方。

及时了解最新的优惠、折扣和特别促销活动。

查看促销

我们使用Cookie

我们使用分析性Cookie来改善您在我们网站上的体验。数据不会出售给第三方。了解更多请查看我们的 隐私政策.