跟 Windows 打交道久了你会发现,OpenSSH Server 本身不难装,难的是装完之后那套“密钥认证连接设置”总能整出点玄学问题。我有一次给一台 Windows Server 2019 配 sshd,服务正常起来了,密码能连,密钥死活连不上,客户端只回一句 Permission denied (publickey),服务端日志里也看不出明确原因。后来折腾半天才发现,问题不在 sshd_config,而是 authorized_keys 文件被记事本默认存成了 UTF-16 编码。从那天起我就知道,Windows 上配密钥认证,光懂 Linux 那套完全不够。
这篇文章就把 Windows OpenSSH Server 从安装到密钥认证跑通的完整链路捋一遍。准备照做的运维、搞自动化的开发、以及已经被 authorized_keys 整到怀疑人生的朋友,都可以直接对着抄。
1. Windows 上做密钥认证,坑点全在“错位”
1.1 明明是同一个 sshd,换个底座就翻脸
OpenSSH 最早是为 Unix-like 系统设计的,Windows 上跑的同名软件只是“行为接近”,底层账户体系、文件权限、路径规则全都不一样。
Linux 下配密钥认证,核心步骤就三条:把公钥写进 ~/.ssh/authorized_keys,chmod 600 收紧权限,改 sshd_config 开 PubkeyAuthentication。整个过程半小时内能搞定。Windows 上同样的逻辑会遇到更多变量:
- 公钥文件放在哪个目录,普通用户和管理员不一样;
- 文件编码必须是 UTF-8 无 BOM,记事本默认存 UTF-16 会直接让公钥失效;
- ACL 权限比 Unix 的
chmod复杂,一旦带了继承来的 Everyone 权限,sshd 会认为文件不安全; - 配置文件路径在
C:\ProgramData\ssh\sshd_config,不是 OpenSSH 安装目录下; - 服务是 Windows 服务,改完配置不会自动 reload,必须重启
sshd。
这些“错位”累积起来,就会出现“好像每一步都按教程做了,但就是连不上”的情况。
1.2 密钥认证解决的是哪类问题
密钥认证不只是为了少输一次密码。它的核心价值在三个方面:
一是安全性。私钥不出客户端机器,公钥即使泄露也不能反向登录,相比密码认证能防暴力破解和撞库。
二是可自动化。脚本、计划任务、CI/CD 流水线、监控系统要连服务器时,没办法交互输入密码,密钥认证是唯一顺手的方案。Windows 自动化里经常要跨节点执行 PowerShell 脚本,用 SSH 通道比开 PSRemoting 再配信任关系轻量得多。
三是跨平台一致性。平时管理一堆 Linux 和 Windows 混合环境时,同一套密钥、同样的 ssh 命令可以直接复用。比如 Windows 和 Linux 之间传文件,用 scp 或 sftp 走密钥认证,比 SMB 共享和 FTP 更省心。
1.3 先确认你不需要第三方安装包
Windows 10 1809 和 Windows Server 2019 开始,OpenSSH 已经是系统可选功能。没必要跑到“openssh 官网下载”那里折腾安装包,系统自带版本完全够用。只有遇到远程漏洞扫描要求升级版本、或需要新特性时,才考虑用新版覆盖。
判断系统里有没有:
powershell复制Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
输出里能看到 OpenSSH.Client 和 OpenSSH.Server 两项。今天讲的是 Server 端,Client 端一般默认就在。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 把服务端从零跑起来:安装、自启、防火墙
2.1 用 PowerShell 干净安装
以管理员身份打开 PowerShell,执行:
powershell复制Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
安装过程不到一分钟。装完系统里会多出两个服务:sshd 和 ssh-agent。前者是 SSH 服务端,后者是密钥代理服务,后面再讲。
如果你用的是旧方法,从 GitHub 下载 OpenSSH 压缩包解压到 C:\Program Files\OpenSSH,原理一样,但要注意服务可执行文件路径可能指向不同的目录,后面改配置时容易踩坑。
2.2 启动服务并设置开机自启
安装完默认不会自动启动,需要手动处理:
powershell复制Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
Get-Service sshd
看到 Status: Running 就说明服务起来了。如果启动失败,优先怀疑端口被占或配置文件语法有问题。Windows 上 OpenSSH 配置文件的错误提示比较隐晦,可以先看事件日志:
powershell复制Get-WinEvent -LogName 'OpenSSH/O
