若要使用安全外壳(SSH)提供安全远程管理,Windows 将 OpenSSH 作为按需功能提供。 但是,作为 Windows 和 Windows Server 安装媒体的一部分随附的内置版本(如 7.7p1 或 8.1p1)通常落后于 GitHub 上提供的最新 Win32-OpenSSH 版本。 若要使用较新的加密算法、增强的日志记录和重要的安全更新,请将 OpenSSH 升级到 GitHub 版本。
本文介绍内置版本与 GitHub 版本之间的差异、如何备份现有配置,以及如何在保持服务设置不变的同时安全地升级。 它还包括有关使用 Windows 更新手动更新 OpenSSH 的说明。
先决条件
-
使用本地管理员凭据登录到计算机。
-
确保 OpenSSH 服务器服务未处理活动会话。
注释
升级会暂时停止 OpenSSH 服务器服务,并断开任何活动 SSH 会话的连接。
-
如果服务重启,可以使用备用访问方法(如 RDP 或控制台)。
-
请确保你具有修改 C:\ProgramData\ssh 并安装 MSI 包的正确权限。
-
在生产环境中安装新版本之前,请先在过渡环境中对其进行测试。
了解系统内置与 GitHub 的 OpenSSH
默认情况下,使用 Windows 更新来安装和维护内置 OpenSSH 功能。 通常,软件驻留在 C:\Windows\System32\OpenSSH 中。 内置版本为 Microsoft 支持且稳定,但仅在 Windows 本身更新时更新。
GitHub 版本(称为 Win32-OpenSSH)安装在 C:\Program Files\OpenSSH 中,并具有最新的功能和修补程序。 但是,必须手动更新它。
步骤 1:备份配置和密钥
在升级之前,请备份所有配置和密钥文件。
下表列出了文件及其默认文件夹位置
| 文件夹和文件 | Description |
|---|---|
| C:\ProgramData\ssh\sshd_config | 服务器配置文件 |
| C:\ProgramData\ssh\administrators_authorized_keys | 管理员帐户的密钥 |
| C:\ProgramData\ssh\ssh_host_*_key | 主机标识密钥 |
| C:\Users<UserName>.ssh\authorized_keys | 针对每个用户的密钥 |
若要复制这些文件,请打开 Windows PowerShell 命令行界面,并运行一个类似于以下的 cmdlet:
Copy-Item "C:\ProgramData\ssh" -Destination "C:\Backup\ssh_backup" -Recurse
重要
-
为了避免客户端信任警告,请不要更改主机或用户密钥。
-
不要更改源文件和文件夹或目标文件和文件夹的文件权限。 私钥必须只能由 SYSTEM 和管理员读取。 若要验证权限,请在 PowerShell 命令提示符下运行以下类似的 cmdlet:
Get-Acl "C:\ProgramData\ssh\ssh_host_ed25519_key" | Format-List
步骤 2:升级 OpenSSH
若要升级 OpenSSH,请选择以下方法之一:
- 选项 1:使用 MSI 安装程序将 OpenSSH 升级到最新的 GitHub 版本
- 选项 2:使用 ZIP 文件将 OpenSSH 升级到最新的 GitHub 版本
- 选项 3:将 OpenSSH 升级到最新的 Windows 更新版本,而不是 GitHub 版本
选项 1:使用 MSI 安装程序将 OpenSSH 升级到最新的 GitHub 版本
注释
OpenSSH 安装在 C:\Program Files\OpenSSH 或 C:\Program Files\OpenSSH-Win64 中,具体取决于处理器。 安装程序会自动注册 OpenSSH 服务并更新 PATH 环境变量。
-
若要下载 MSI 安装程序,请转到 GitHub 上的Win32-OpenSSH 发布页,并下载最新的 Win64 或 Win32 OpenSSH .msi 文件。
-
若要安装新版本的所有组件,请以管理员身份打开 PowerShell 命令提示符窗口,并运行类似于以下 cmdlet 的 cmdlet:
msiexec /i OpenSSH-Win64-v9.x.x.x.msi -
若要仅安装客户端或服务器组件,请打开管理 PowerShell 命令提示符窗口,并根据需要运行类似于以下 cmdlet 之一的 cmdlet:
msiexec /i OpenSSH-Win64-v9.x.x.x.msi ADDLOCAL=Client msiexec /i OpenSSH-Win64-v9.x.x.x.msi ADDLOCAL=Server -
若要配置 OpenSSH 服务器服务,然后启动它,请在安装了服务器组件的计算机上运行以下 cmdlet:
Start-Service sshd Set-Service sshd -StartupType Automatic如果未创建服务,请运行以下命令:
PowerShell.exe -ExecutionPolicy Bypass -File "C:\Program Files\OpenSSH\install-sshd.ps1"
选项 2:使用 .zip 文件将 OpenSSH 升级到最新的 GitHub 版本
如果不想使用 MSI 包安装升级,可以使用 .zip 存档文件。
-
若要下载最新的 .zip 文件,请转到 GitHub 上的Win32-OpenSSH 发布页面,并下载相应的文件。
-
将 .zip 文件解压缩到 C:\Program Files\OpenSSH。
-
打开管理 PowerShell 窗口,更改为 C:\Program Files\OpenSSH 文件夹,然后运行以下命令:
PowerShell.exe -ExecutionPolicy Bypass -File .\install-sshd.ps1 -
若要配置 OpenSSH 服务器服务,然后启动它,请运行以下 cmdlet。
Start-Service sshd Set-Service sshd -StartupType Automatic
选项 3:将 OpenSSH 升级到最新的 Windows 更新版本,而不是 GitHub 版本
-
若要检查当前版本的 OpenSSH,请在 PowerShell 命令提示符下运行
ssh -V。 -
若要卸载当前版本的 OpenSSH,请在 PowerShell 命令提示符处运行以下 cmdlet:
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 -
卸载软件后,重启 Windows。
-
若要从 Windows 更新安装最新版本,请在 PowerShell 命令提示符处运行以下 cmdlet:
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0 -
若要配置 OpenSSH 服务器服务,然后启动它,请运行以下 cmdlet:
Start-Service sshd Set-Service sshd -StartupType Automatic
步骤 3:根据需要创建防火墙规则
-
若要检查现有防火墙规则,请转到 OpenSSH 客户端计算机,并在 PowerShell 命令提示符处运行以下 cmdlet:
Get-NetFirewallRule -DisplayName "*SSH*" | Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq 22} -
如果找不到现有的 SSH 规则,请打开管理 PowerShell 命令提示符窗口。 然后,运行以下 cmdlet:
New-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -DisplayName "OpenSSH Server (SSH)" -Enabled True -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -
若要验证规则是否已正确配置,请再次运行
Get-NetFirewallRule。
步骤 4:验证安装
-
确保 C:\ProgramData\ssh 仍具有以前的配置和密钥。 如有必要,请从备份还原此信息。
-
若要检查版本,请在 PowerShell 命令提示符下运行
ssh -V。 -
若要检查服务状态和连接性,请在 PowerShell 命令提示符处运行以下 cmdlet:
Get-Service sshd ssh localhost注释
服务的显示名称为“OpenSSH SSH 服务器”。
-
若要验证你使用的是正确的 SSH 二进制文件,请在 Windows PowerShell 命令提示符处运行以下 cmdlet:
Get-Command ssh.exe | Select-Object Source -
若要检查错误,请打开事件查看器,然后选择 “应用程序和服务日志>OpenSSH>操作”。
-
确保管理员和用户可以进行身份验证。
-
若要避免路径冲突,请检查多个 OpenSSH 文件夹(通常位于 System32 文件夹中)。 如果存在多个 OpenSSH 文件夹,请保留最新的文件夹,并删除任何较旧的文件夹。
常见问题快速参考
| 症状 | 可能的原因 | 解决方案 |
|---|---|---|
| SSH 服务未启动 | 主机密钥缺失或配置错误 | 还原备份的密钥并重启服务 |
| 身份验证错误 | 密钥文件权限不正确 | 确保只有系统管理员可以读取或写入密钥文件 |
| 旧二进制文件仍在运行 | PATH 仍指向 System32\OpenSSH | 删除或重命名过时的目录 |
| 端口 22 无法访问 | 缺少防火墙规则 | 为 TCP 端口 22 重新创建入站规则 |