Logo
Overview

SSH Key 免密登录详解:从原理到多设备配置的完整实践指南

2025/11/27
约 6 分钟阅读

SSH Key(公钥/私钥认证)是现代服务器运维中最常用、最安全、最舒服的一种登录方式。

配置成功后,你可以:

  • 🚀 登录 VPS 不再输入密码
  • 💻 VS Code Remote-SSH 一键进入开发环境
  • 🔄 自动化任务(如 git 拉取、自动部署)不再受密码阻碍
  • 🔐 多设备管理账号更方便、安全可控

本文将以 “Windows 用户视角” 出发,讲清楚 SSH Key 的原理、避坑配置、多设备实践以及 VS Code 联动。

一、SSH Key 是什么?为什么要用它?

SSH Key 是通过 一对密钥文件(私钥 + 公钥) 来验证身份的。

  • 私钥 (Private Key):保存在你自己电脑上,绝不能泄露(相当于你的指纹)。
  • 公钥 (Public Key):放到服务器上,允许对应私钥持有者访问(相当于指纹锁存的指纹数据)。

验证时不会传输私钥,而是通过加密握手确认“你确实拥有私钥”。

相比传统密码登录:

登录方式优点缺点
密码简单易被爆破、不适合自动化、VS Code 会不断弹窗烦死人
SSH Key安全、免密、顺滑Windows 下配置容易遇到编码坑 (本文解决)

一句话:SSH Key = 更安全 + 更省心 + 更专业

二、生成密钥 (本地 Windows)

在你的 本地电脑 PowerShell 中执行(推荐使用 ed25519 算法,比 RSA 更快更安全):

ssh-keygen -t ed25519 -C "my-laptop"

一路回车即可。

  • 关于 Passphrase
    • 回车留空:为了极致的方便,登录完全免密。
    • 设置密码:如果你的电脑经常借给别人用,或者担心私钥文件被盗,可以设个密码(双重保险)。

生成后,文件通常在 C:\Users\用户名\.ssh\

  • id_ed25519:私钥(保管好!)
  • id_ed25519.pub:公钥(我们要发给 VPS)

三、部署公钥到 VPS (一键直连版)

⚠️ 高能预警:Windows PowerShell 的管道 (|) 传输文本时,经常会带入 UTF-16 编码或特殊的换行符,导致 Linux 服务器识别为乱码,出现“明明配了 Key 却还是要输密码”的经典 Bug。

为了彻底解决这个问题,这里使用懒人一键直连方案。不需要新建脚本文件!直接打开 PowerShell,复制下面这整段代码,一次性粘贴进去按回车即可。

这段代码会自动处理编码,并且支持非标准端口(如 2222)。

& {
# --- 配置开始 ---
$ErrorActionPreference = "Stop"
$KeyPath = "$env:USERPROFILE\.ssh\id_ed25519"
# 1. 检查或生成密钥 (如不存在则生成)
if (-not (Test-Path $KeyPath)) {
Write-Host "正在生成密钥..." -ForegroundColor Yellow
# -N "" 表示无密码,为了极致快;如需密码去掉 -N "" 即可
ssh-keygen -t ed25519 -f $KeyPath -C "windows_auto_key" -N ""
} else {
Write-Host "✅ 检测到已有密钥,准备复用" -ForegroundColor Green
}
# 2. 读取公钥 (核心:内存清洗格式,防止乱码)
$Pub = (Get-Content "$KeyPath.pub" -Raw).Trim()
# 3. 交互输入地址 (支持端口)
Write-Host "`n请输入 VPS 连接信息:" -ForegroundColor Cyan
Write-Host " - 默认端口(22)直接输:[email protected]" -ForegroundColor Gray
Write-Host " - 非标准端口请加参数:-p 2222 [email protected]" -ForegroundColor Gray
$RawInput = Read-Host "> "
if (-not $RawInput) { Write-Error "地址不能为空"; return }
# 关键处理:按空格分割参数,确保 -p 2222 能被 SSH 正确识别
$TargetArgs = $RawInput -split ' '
Write-Host "`n正在连接服务器上传公钥..." -ForegroundColor Cyan
Write-Host "⚠️ 注意:接下来请输入一次服务器的【登录密码】" -ForegroundColor Yellow
# 执行 SSH 组合拳
ssh $TargetArgs "mkdir -p ~/.ssh && echo '$Pub' >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
if ($?) {
Write-Host "`n🎉 配置成功!" -ForegroundColor Green
Write-Host "请尝试直接登录: ssh $RawInput" -ForegroundColor Gray
}
}

四、配置 ~/.ssh/config (提升幸福感)

每次登录都要打 ssh [email protected] 太麻烦?配置别名吧。

在本地 C:\Users\用户名\.ssh\ 下新建或编辑 config 文件(没有后缀名):

Host my-vps
HostName 1.2.3.4
User root
IdentityFile ~/.ssh/id_ed25519
# 如果端口不是 22,加一行: Port 2222
Port 2222

以后你只需要输入:

ssh my-vps

即可秒进服务器!

五、VS Code Remote-SSH 终极开发体验

配置好 SSH Key 和 Config 后,VS Code 的体验将发生质变:

  1. 安装扩展:Remote - SSH
  2. 点击左下角绿色图标 >< -> Connect to Host…
  3. 选择刚才配置的 my-vps

效果:

  • 不再弹窗:完全不会再跳出输入密码的框框。
  • 如丝般顺滑:打开远程文件夹、保存代码、运行终端,体验和本地开发一模一样。
  • 自动重连:网络波动断开后,VS Code 会自动静默重连,无需人工干预。

六、进阶:多设备与安全性

1. 多台电脑怎么管?(A/B/C 电脑)

原则:认钥匙不认人。 不要把 A 电脑的私钥拷贝给 B 电脑(不安全)。

  • A 电脑生成一对 Key,把公钥给 VPS。
  • B 电脑生成一对 Key,把公钥给 VPS。
  • VPS 的 authorized_keys 文件里会有两行记录。

哪天 B 电脑丢了?去 VPS 上删掉 B 的那一行公钥,B 就再也进不来了,A 不受影响。

2. 关闭密码登录 (Security Hardening)

当确认 SSH Key 能稳定登录后,建议关闭密码登录,彻底封死暴力破解的路径。

编辑 /etc/ssh/sshd_config

PasswordAuthentication no
PubkeyAuthentication yes

重启 SSH 服务:service ssh restart

七、小结

SSH Key 登录是每个开发者、运维人员都应该掌握的基础设施。

你未来如果做:

  • WordPress 插件开发 (直接在服务器上改代码调试)
  • Python 数据脚本
  • CI/CD 自动部署 (Github Actions 需要私钥)

这套配置都将是你高效工作的基石。