SSH免密码登录 Windows:从原理到实操,一篇讲透
关键词
ssh免密码登录 Windows
一、问题分析
很多人说“SSH 免密码登录”,其实指的是:
客户端用密钥认证登录 Windows 电脑时,不再每次输入账户密码。
这套方法常用于:
- 远程管理 Windows 服务器
- 用 Linux / MACOS 电脑连接 Windows
- 自动化脚本批量执行命令
- 家庭局域网内远程运维
和传统“账号 + 密码”登录相比,SSH 密钥登录更安全,也更方便。
因为密钥是一对文件:
- 公钥:放在 Windows 端
- 私钥:保存在你自己的电脑上
登录时,SSH 服务端会验证你是不是持有对应私钥的人。
只要配置正确,后面连接 Windows 就不用再输入密码了。
二、适用场景
1. Windows 开启 OpenSSH Server
比如你的 Windows 10 / Windows 11 / Windows Server 需要接受 SSH 远程连接。
2. Linux / macOS 连接 Windows
例如你在 Ubuntu、CentOS、Mac 上,用 ssh 命令远程进 Windows。
3. Windows 连接 Windows
两台 Windows 电脑之间也可以通过密钥实现免密登录。
三、前置条件
在开始之前,先确认这几件事:
1. Windows 版本
建议使用:
- Windows 10 1809 及以上
- Windows 11
- Windows Server 2019 / 2022
这些版本一般都能直接安装 OpenSSH Server。
2. 需要管理员权限
安装服务、修改配置、设置权限,通常都要管理员权限。
3. 确认网络可达
两台设备必须能互相访问:
- 同一局域网
- 或者已经打通公网/内网穿透/VPN
4. 记住 Windows 登录账户名
后面配置时会用到,比如:
AdministratortestUser01
四、Windows 端安装 SSH 服务
方法一:图形界面安装
这是最适合小白的方法。
操作步骤
- 打开 设置
- 进入 应用
- 点击 可选功能
- 选择 添加可选功能
- 找到并安装:
- OpenSSH Server
- (可选)OpenSSH Client
安装完成后,继续下一步。
方法二:PowerShell 安装
如果你习惯命令行,可以直接执行:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
安装完成后,启动服务:
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
检查服务状态:
Get-Service sshd
如果显示 Running,说明 SSH 服务已经启动。
五、确认 Windows 防火墙放行 22 端口
SSH 默认使用 22 端口。
如果防火墙没放行,外部机器根本连不上。
PowerShell 放行命令
New-NetFirewallRule -Name sshd -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
检查是否监听成功
netstat -ano | findstr :22
如果看到类似 LISTENING,说明 SSH 正在监听 22 端口。
六、生成 SSH 密钥
SSH 免密登录的核心,就是密钥对。
方式一:在 Linux / macOS 生成
打开终端,执行:
ssh-keygen -t ed25519 -C "yourname"
然后一路回车即可。
如果你想更稳妥,也可以用:
ssh-keygen -t rsa -b 4096
生成后,默认会得到:
- 私钥:
~/.ssh/id_ed25519或id_rsa - 公钥:
~/.ssh/id_ed25519.pub或id_rsa.pub
方式二:在 Windows 本机生成
如果你是在 Windows 客户端上发起连接,也可以在 PowerShell 中执行:
ssh-keygen -t ed25519 -C "yourname"
生成位置一般在:
C:\Users\你的用户名\.ssh\
七、把公钥放到 Windows 的授权位置
这是最关键的一步。
Windows 的 OpenSSH Server 会读取一个授权公钥文件,常见位置有两个:
1. 当前用户级别
适合普通账户登录:
C:\Users\用户名\.ssh\authorized_keys
2. 系统级别
适合管理员登录或多用户环境:
C:\ProgramData\ssh\administrators_authorized_keys
八、普通用户实现免密码登录
如果你是普通账户登录 Windows,按下面操作。
第一步:找到你的公钥内容
在客户端电脑上打开 .pub 文件,例如:
cat ~/.ssh/id_ed25519.pub
复制整行内容,类似这样:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... yourname
第二步:在 Windows 上创建 .ssh 文件夹
登录到 Windows 目标机器,执行 PowerShell:
mkdir C:\Users\用户名\.ssh
第三步:创建 authorized_keys 文件
打开记事本,把公钥粘贴进去,保存为:
C:\Users\用户名\.ssh\authorized_keys
注意:
- 文件名必须是
authorized_keys - 不要加
.txt - 内容只能是一行或多行公钥
九、管理员账户实现免密码登录
如果你是用 Windows 的管理员账号登录,推荐使用这个方案。
第一步:把公钥写入管理员授权文件
在 Windows 上执行:
notepad C:\ProgramData\ssh\administrators_authorized_keys
把公钥粘进去保存。
第二步:设置正确权限
权限不对,SSH 会直接拒绝密钥登录。
执行下面命令:
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant administrators:F
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant SYSTEM:F
如果是用户级 authorized_keys,也要确保权限干净,至少不要让权限过于开放。
十、修改 Windows SSH 配置文件
SSH Server 的配置文件一般在:
C:\ProgramData\ssh\sshd_config
打开后,确认这些配置项存在并启用:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
如果你使用的是管理员授权文件,可以保留默认行为,一般会自动识别:
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
修改后重启 SSH 服务
Restart-Service sshd
或者:
net stop sshd
net start sshd
十一、从客户端测试登录
在客户端电脑上执行:
ssh 用户名@Windows_IP地址
例如:
ssh test@192.168.1.100
如果一切正常,第一次可能会提示确认主机指纹:
Are you sure you want to continue connecting (yes/no/[fingerprint])?
输入:
yes
之后如果密钥配置正确,就会直接登录,不再要求输入密码。
十二、如果还是要密码,怎么排查
这是最常见的问题。
明明已经放了公钥,但登录时还是要密码,通常是下面几个原因。
1. 公钥内容复制错了
常见错误:
- 少复制了一部分
- 多复制了换行
- 把
.pub文件内容复制成乱码 - 公钥格式被改坏
正确格式必须像这样:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxx user@host
2. authorized_keys 文件名不对
要确保是:
authorized_keys
不是:
authorized_keys.txt
Windows 默认会隐藏扩展名,新手最容易踩坑。
3. 权限不正确
OpenSSH 对权限很敏感。
如果文件权限太宽松,SSH 会直接忽略它。
你可以检查:
icacls C:\Users\用户名\.ssh\authorized_keys
建议让文件只给当前用户和系统必要权限。
4. sshd_config 没启用密钥登录
确认:
PubkeyAuthentication yes
没有被注释掉。
5. 连接用户名写错
SSH 登录时的用户名,必须是 Windows 上真实存在的账户名。
比如你在 Windows 上是 Admin01,连接时也要写:
ssh Admin01@192.168.1.100
6. 你连的是管理员账户,但放错位置
如果是管理员组账户,很多人把公钥写到:
C:\Users\用户名\.ssh\authorized_keys
但系统实际读取的是:
C:\ProgramData\ssh\administrators_authorized_keys
这个地方最容易出错。
十三、建议开启的安全优化
SSH 免密登录虽然方便,但也要注意安全。
1. 禁止密码登录,只保留密钥
如果你确认密钥可用,可以进一步提高安全性。
在 sshd_config 中设置:
PasswordAuthentication no
这样就只能用密钥登录,不能再暴力猜密码。
2. 修改默认 22 端口
虽然不是必须,但能减少被扫描的概率。
例如改成:
Port 2222
然后记得同步放行防火墙。
连接时要写:
ssh -p 2222 用户名@IP
3. 只给必要用户开 SSH
别把所有账户都暴露给 SSH。
只保留管理账号即可,减少风险。
4. 定期备份密钥
私钥丢了,就没法免密登录了。
建议备份到安全位置,比如:
- 加密 U 盘
- 密码管理器
- 离线备份盘
十四、常见故障处理
1. 提示 “Permission denied (publickey)”
说明公钥认证失败。
排查顺序:
- 检查用户名是否正确
- 检查公钥是否写入正确位置
- 检查
authorized_keys文件名 - 检查权限
- 检查
sshd_config是否启用PubkeyAuthentication yes - 重启
sshd服务
2. 连不上 22 端口
先在 Windows 上执行:
netstat -ano | findstr :22
再检查防火墙:
Get-NetFirewallRule -Name sshd
如果规则没开,就重新添加。
3. 一直提示输入密码
大概率是:
- 客户端没用对应私钥
- ssh-agent 没加载密钥
- 服务器没识别公钥
可以强制指定私钥测试:
ssh -i ~/.ssh/id_ed25519 用户名@Windows_IP
4. 连接后是黑屏,没法输入
有些 Windows 环境在远程 SSH 下默认 shell 异常。
可以检查默认 shell 配置,必要时恢复为 cmd.exe 或 PowerShell。
查看默认 shell:
reg query HKLM\SOFTWARE\OpenSSH /v DefaultShell
设置为 PowerShell 示例:
reg add HKLM\SOFTWARE\OpenSSH /v DefaultShell /t REG_SZ /d "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" /f
然后重启 SSH 服务:
Restart-Service sshd
十五、一个完整的实战示例
假设你有一台 Windows 11 电脑,IP 是 192.168.1.100,用户名是 test,想让 Ubuntu 电脑免密登录它。
1. Windows 上安装并启动 SSH
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
2. 放行防火墙
New-NetFirewallRule -Name sshd -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
3. Ubuntu 上生成密钥
ssh-keygen -t ed25519
4. 查看公钥
cat ~/.ssh/id_ed25519.pub
5. 把公钥写入 Windows
保存到:
C:\Users\test\.ssh\authorized_keys
6. 测试连接
ssh test@192.168.1.100
如果成功,后续就不需要再输入 Windows 密码了。
十六、进阶方案:多台机器批量管理
如果你有多台 Windows 机器,建议这样规划:
- 每台机器单独一个账户
- 每台机器单独一个 authorized_keys
- 公钥统一由管理员保管
- 禁用密码登录
- 修改默认端口
- 配合 VPN 或内网穿透使用
这样安全性更高,也方便后期维护。
十七、总结
SSH 免密码登录 Windows 的核心逻辑其实很简单:
- Windows 安装并开启 OpenSSH Server
- 客户端生成密钥对
- 把公钥放到 Windows 的授权文件里
- 配好权限和防火墙
- 用
ssh 用户名@IP测试连接
只要步骤没错,后面登录就会非常省事。
对于日常远程管理、脚本自动化、服务器维护来说,这套方案比传统密码登录更稳、更安全,也更专业。
十八、最简命令汇总
Windows 安装 SSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
放行防火墙
New-NetFirewallRule -Name sshd -DisplayName "OpenSSH Server (sshd)" -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
客户端生成密钥
ssh-keygen -t ed25519
连接 Windows
ssh 用户名@Windows_IP
指定密钥连接
ssh -i ~/.ssh/id_ed25519 用户名@Windows_IP
还没有评论,来说两句吧...