1. 场景说明
目标:让其他电脑通过 SSH 连接这台 Win11 主机。
Win11 主机用户名示例:
IV01
Win11 用户目录示例:
C:\Users\IV01
SSH 默认目录:
C:\Users\IV01\.ssh
2. 生成 SSH 密钥
在 PowerShell 中执行:
ssh-keygen -t ed25519 -C "IV01"
参数说明:
-t ed25519 指定生成 ed25519 类型密钥
-C "IV01" 给公钥添加备注,方便识别
推荐直接保存到默认路径:
C:\Users\IV01\.ssh\id_ed25519
如果手动输入了名字,例如:
iv123456
则会生成:
C:\Users\IV01\iv123456
C:\Users\IV01\iv123456.pub
建议移动到 .ssh 目录:
mkdir C:\Users\IV01\.ssh -Force
move C:\Users\IV01\iv123456 C:\Users\IV01\.ssh\iv123456
move C:\Users\IV01\iv123456.pub C:\Users\IV01\.ssh\iv123456.pub
文件说明:
iv123456 私钥,客户端使用,不能泄露
iv123456.pub 公钥,放到被连接的服务器上
3. 安装 OpenSSH Server
检查 Win11 是否安装 OpenSSH Server:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'
如果显示:
State : Installed
说明已安装。
如果没有安装,使用管理员 PowerShell 执行:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
4. 启动 SSH 服务
使用管理员 PowerShell 执行:
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
检查服务状态:
Get-Service sshd
正常应该看到:
Status Name
Running sshd
5. 放行防火墙端口
SSH 默认端口是 22。
使用管理员 PowerShell 执行:
New-NetFirewallRule `
-Name sshd `
-DisplayName "OpenSSH Server" `
-Enabled True `
-Direction Inbound `
-Protocol TCP `
-Action Allow `
-LocalPort 22
如果提示规则已经存在,可以忽略。
6. 普通用户的公钥配置
如果被连接的 Win11 用户不是管理员账户,通常把公钥写入:
C:\Users\IV01\.ssh\authorized_keys
命令:
mkdir C:\Users\IV01\.ssh -Force
type C:\Users\IV01\.ssh\iv123456.pub >> C:\Users\IV01\.ssh\authorized_keys
然后测试:
ssh -i C:\Users\IV01\.ssh\iv123456 IV01@127.0.0.1
7. Win11 管理员账户的关键坑
如果登录用户属于 Windows 管理员组,例如 IV01 是管理员账户,那么 OpenSSH Server 可能不会读取:
C:\Users\IV01\.ssh\authorized_keys
而是读取:
C:\ProgramData\ssh\administrators_authorized_keys
这是 Win11 OpenSSH 最容易踩坑的地方。
7.1 确认用户是否是管理员
执行:
net localgroup administrators
如果列表中有:
IV01
说明该用户是管理员账户。
7.2 管理员账户正确配置方式
使用管理员 PowerShell 执行:
mkdir C:\ProgramData\ssh -Force
Get-Content C:\Users\IV01\.ssh\iv123456.pub |
Out-File -Encoding ascii -Append C:\ProgramData\ssh\administrators_authorized_keys
设置权限:
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant "Administrators:F" /grant "SYSTEM:F"
重启 SSH 服务:
Restart-Service sshd
再次测试:
ssh -i C:\Users\IV01\.ssh\iv123456 IV01@127.0.0.1
8. 检查 sshd_config 配置
配置文件路径:
C:\ProgramData\ssh\sshd_config
打开:
notepad C:\ProgramData\ssh\sshd_config
重点检查:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
如果存在下面这段:
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
说明管理员组用户会走:
C:\ProgramData\ssh\administrators_authorized_keys
修改配置后需要重启服务:
Restart-Service sshd
9. 本机测试 SSH 是否成功
在 Win11 服务器本机执行:
ssh -i C:\Users\IV01\.ssh\iv123456 IV01@127.0.0.1
如果不再要求输入 Windows 密码,而是直接登录成功,说明密钥认证已生效。
如果仍然出现:
IV01@127.0.0.1's password:
Permission denied, please try again.
说明 SSH 服务是通的,但密钥没有被服务器接受。
10. 用详细日志排查
执行:
ssh -vvv -i C:\Users\IV01\.ssh\iv123456 IV01@127.0.0.1
关键日志:
Offering public key: C:\\Users\\IV01\\.ssh\\iv123456
如果后面没有:
Server accepts key
而是出现:
Next authentication method: password
说明服务器拒绝了这个公钥。
常见原因:
1. 公钥没有写入 authorized_keys
2. 当前用户是管理员账户,但公钥没有写入 administrators_authorized_keys
3. administrators_authorized_keys 权限不正确
4. sshd_config 配置没有启用公钥认证
5. 修改配置后没有重启 sshd
11. 其他电脑连接这台 Win11
先在 Win11 服务器上查询 IP:
ipconfig
找到 IPv4 地址,例如:
192.168.1.123
其他电脑连接:
ssh IV01@192.168.1.123
如果客户端需要指定私钥:
ssh -i C:\Users\客户端用户名\.ssh\你的私钥 IV01@192.168.1.123
注意:
客户端使用私钥
服务器保存公钥
12. 私钥和公钥的关系
私钥:
C:\Users\IV01\.ssh\iv123456
用途:
客户端拿它去连接服务器
不能泄露
不能发给别人
不能上传到网页
公钥:
C:\Users\IV01\.ssh\iv123456.pub
用途:
放到服务器 authorized_keys 或 administrators_authorized_keys 里面
可以给服务器保存
13. 推荐的最终目录结构
C:\Users\IV01\.ssh\
里面可以有:
iv123456
iv123456.pub
authorized_keys
known_hosts
如果 IV01 是管理员账户,还需要:
C:\ProgramData\ssh\administrators_authorized_keys
14. 最终结论
Win11 作为 SSH 服务器时,流程是:
1. 安装 OpenSSH Server
2. 启动 sshd 服务
3. 放行防火墙 22 端口
4. 生成 SSH 密钥
5. 把客户端公钥写入服务器的 authorized_keys
6. 如果登录用户是管理员账户,把公钥写入 C:\ProgramData\ssh\administrators_authorized_keys
7. 设置 administrators_authorized_keys 权限
8. 重启 sshd
9. 使用 ssh -i 私钥 用户名@主机IP 测试连接
最重要的坑:
Win11 管理员账户通常需要使用:
C:\ProgramData\ssh\administrators_authorized_keys
而不是只使用:
C:\Users\用户名\.ssh\authorized_keys