从 macOS 免密 SSH 到 Windows 10 完整配置指南

文章目录

引言 :Windows 10 内置了 OpenSSH Server,使得跨平台远程管理变得非常方便。然而,由于 Windows 独特的权限模型和旧版 OpenSSH 的一些历史遗留逻辑,许多用户在配置 macOS 到 Win10 的免密登录时会遇到"公钥认证失败"的诡异问题。本文将直接提供最稳妥的推荐配置步骤,并补充默认终端设置、Git Bash 集成等进阶技巧,最后附上详细的排障指南,助你一次性配置成功。

推荐配置步骤

本方案以 Windows 本地管理员账号为例,采用系统级授权文件配置,这是 Windows OpenSSH 官方推荐且最不容易出错的安全实践。

客户端(macOS)生成密钥

在 macOS 终端执行以下命令生成 Ed25519 密钥对(已有的跳过):

bash 复制代码
ssh-keygen -t ed25519 -C "macbook_to_win10"

一路回车使用默认路径即可。

服务端(Win10)安装与启用 OpenSSH

在配置公钥之前,需确保 Windows 10 已正确安装并启动 OpenSSH Server。推荐使用 PowerShell 一键完成安装、启动及开机自启设置:

powershell 复制代码
# 以管理员身份运行 PowerShell
# 1. 安装 OpenSSH Server(若已安装则自动跳过)
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

# 2. 启动 SSHD 服务
Start-Service sshd

# 3. 设置为开机自动启动
Set-Service -Name sshd -StartupType Automatic

# 4. 确认防火墙规则已自动创建(通常安装时会自动添加)
Get-NetFirewallRule -Name *ssh*

验证安装 :执行 Get-Service sshd,确认状态为 Running;执行 ssh -V 可查看当前安装的 OpenSSH 版本号。若后续计划升级到 GitHub 维护的新版本,也可跳过此安装直接执行升级操作。

服务端(Win10)配置公钥

对于属于 Administrators 组的用户,Windows OpenSSH 强制要求使用系统级授权文件。

  1. 在 Win10 上以管理员身份打开 PowerShell。

  2. 将 macOS 的公钥(~/.ssh/id_ed25519.pub)内容追加到系统级授权文件中:

    powershell 复制代码
    # 创建文件(如果不存在)并写入公钥(请将 <你的公钥内容> 替换为实际内容)
    Add-Content -Path "C:\ProgramData\ssh\administrators_authorized_keys" -Value "<你的公钥内容>"
  3. 严格设置文件 NTFS 权限(核心步骤)
    该文件必须且只能被 Administrators 组和 SYSTEM 访问,否则 SSHD 会静默拒绝。

    powershell 复制代码
    $path = "C:\ProgramData\ssh\administrators_authorized_keys"
    # 移除继承权限
    icacls $path /inheritance:r
    # 授予 SYSTEM 和 Administrators 完全控制权限
    icacls $path /grant "SYSTEM:(F)"
    icacls $path /grant "Administrators:(F)"
重启服务与免密登录验证

完成公钥配置后,需在 Windows 端重启 SSHD 服务使配置生效,并在 macOS 端使用正确的用户名和 IP 发起连接验证。

  1. 重启 SSHD 服务

    在 Windows PowerShell(管理员)中执行:

    powershell 复制代码
    Restart-Service sshd
  2. 确认登录用户名

    SSH 免密登录的用户名必须与 Windows 当前登录的本地账户名完全一致(区分大小写)。请在 Windows PowerShell 中执行以下命令获取准确用户名:

    powershell 复制代码
    whoami
    # 输出示例:desktop-abc123\lixiaobai
    # 实际 SSH 登录时仅使用反斜杠后的部分:lixiaobai

    ⚠️ 注意:不要使用 Microsoft 账户的邮箱前缀或显示名称作为 SSH 用户名,除非你已明确将该邮箱前缀设置为本地账户别名。始终以 whoami 输出的结果为准。

  3. 获取 Windows 本机 IP 地址

    在 Windows PowerShell 中执行:

    powershell 复制代码
    ipconfig
    • /all 参数的作用:显示所有网络适配器的完整配置信息,包括 IPv4 地址、子网掩码、默认网关、DNS 服务器以及适配器的描述名称。
    • 在输出中找到你当前联网的适配器(如"以太网"或"WLAN"),记录其 IPv4 地址 (如 192.168.102.110)。
  4. 从 macOS 发起免密登录测试

    回到 macOS 终端,执行:

    bash 复制代码
    ssh lixiaobai@192.168.102.110

    若配置正确,将直接进入 Windows PowerShell(或你设置的默认 Shell),无需输入密码。首次连接会提示指纹确认,输入 yes 即可。

升级 Windows OpenSSH 版本

Windows 10 可选功能中自带的 OpenSSH 版本非常陈旧,存在诸多限制和 Bug。强烈建议升级到 GitHub 官方维护的新版本。

版本对比与升级收益
特性 Win10 自带版本 (7.7p1) GitHub 维护新版本 (v9.x+)
管理员公钥逻辑 可能存在硬编码限制,修改配置无效 已修复,完全遵循 sshd_config 配置
算法支持 不支持部分现代密钥算法 支持 Ed25519, RSA-SHA256 等现代算法
FIDO2 硬件密钥 不支持 支持 (sk-ecdsa, sk-ed25519)
维护状态 微软已逐渐放弃维护 活跃维护,定期修复 CVE
升级步骤
  1. 卸载旧版:在 Win10 设置 -> 应用 -> 可选功能 中,卸载"OpenSSH 服务器"。
  2. 下载新版 :前往 PowerShell/Win32-OpenSSH Releases,下载最新的 OpenSSH-Win64-vX.X.X.X.msi
  3. 安装与配置:运行 MSI 安装包,安装时勾选"配置 SSH 服务"和"配置防火墙"。
  4. 验证 :在 PowerShell 中运行 ssh -V,确认版本已更新。
    注:升级后,管理员账号的公钥认证逻辑将回归标准 Linux 行为,你可以直接在 ~/.ssh/authorized_keys 中配置公钥,无需再使用 administrators_authorized_keys

Git Bash 安装与环境配置

Git Bash 是 Git for Windows 软件包自带的类 Linux 终端环境,安装 Git 即可同步完成部署,无需单独下载。

下载与安装
  1. 获取安装包 :访问 Git 官网(https://git-scm.com/downloads)点击"Download for Windows";国内网络若下载缓慢,可选用 npmmirror 等国内镜像站获取最新安装包。
  2. 运行安装程序 :双击 .exe 文件启动安装向导,接受许可协议后选择安装路径(建议避开含中文或空格的路径,如 D:\Git)。
  3. 关键配置项
    • 组件选择:保留默认勾选,确保"Git Bash Here""Git GUI Here"已选中,便于右键快捷调用。
    • 默认编辑器:新手建议切换为 Visual Studio Code 或 Notepad++,避免使用默认的 Vim 导致操作困难,如果都没有安装,则选择系统自带记事本(Notepad)。
    • PATH 环境变量:推荐选择第二项"Git from the command line and also from 3rd-party software",使 Git 命令可在 CMD、PowerShell 及 VS Code 终端中直接调用,同时避免覆盖系统自带工具。
    • 换行符转换:务必选择"Checkout Windows-style, commit Unix-style line endings",确保跨平台协作时不会因换行符差异触发误报。
    • 终端模拟器:默认选择 MinTTY,提供更优的终端渲染与色彩支持。
  4. 验证安装 :安装完成后打开 CMD 或 PowerShell,执行 git --version,若正常输出版本号即表示安装成功。
Git 目录说明与 PATH 配置

Git 安装后会在目录下生成三个核心文件夹,配置 PATH 时需特别注意区分,避免与系统命令冲突:

目录 包含内容 PATH 配置建议
cmd git.exe、gitk.exe 等 Git 核心命令包装器 安装时已自动加入 PATH,无需手动添加
bin bash.exe、sh.exe 等 Git Bash 命令包装器 若需在 PowerShell/CMD 中直接输入 bash 进入 Git Bash 环境,需手动将该目录加入系统 PATH
usr/bin bash 实体文件及 ls、grep、find 等 Unix 工具 严禁加入 PATH,其中大量命令与 Windows 系统同名,添加后会导致系统命令被覆盖,引发严重冲突
在 PowerShell 中快捷调用 Git Bash

如果你希望在终端里直接输入 bashsh 进入 Git Bash 环境,需要配置环境变量。

配置方法 :将 C:\Program Files\Git\bin 添加到系统环境变量 PATH 中即可。重启终端后即可直接输入 bashsh 进入 Git Bash 环境。

设置默认 Shell

默认情况下,SSH 登录 Windows 会进入老旧的 cmd.exe。我们可以将其更改为 PowerShell 或 Git Bash。

设置默认终端为 PowerShell

在 Win10 的 PowerShell(管理员)中执行:

powershell 复制代码
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force
设置默认终端为 Git Bash

如果你安装了 Git for Windows,可以将默认 Shell 设置为 Git Bash:

powershell 复制代码
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\Git\bin\bash.exe" -PropertyType String -Force

注意:这里必须指向 bin\bash.exe,而不是 git-bash.exe(后者是一个 GUI 包装器,会导致 SSH 会话直接闪退)。

常见问题与排障指南

如果在配置过程中遇到 Permission denied (publickey),请参考以下排障指南。

核心踩坑:管理员账号公钥认证失败(旧版 7.7p1 专属)

现象 :公钥指纹一致,但始终报 Failed publickey

根因 :在 Win10 自带的 OpenSSH 7.7p1 中,对于 Administrators 组的用户,SSHD 可能存在一个硬编码的安全限制

C:\ProgramData\ssh\sshd_config 末尾有如下配置:

text 复制代码
# Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

最大的坑在于 :很多教程说"把这两行取消注释就能生效",或者"为了使用用户目录下的 .ssh/authorized_keys,把这两行注释掉并重启服务"。

事实是 :在 7.7p1 版本中,即使你将这两行注释掉并重启 sshd,该硬编码逻辑依然生效! 管理员账号永远不会 读取 $HOME\.ssh\authorized_keys,而是强制读取 administrators_authorized_keys

解决办法

  1. 按照本文"推荐配置步骤",乖乖使用 administrators_authorized_keys 并设置严格权限。
  2. 或者,直接升级 OpenSSH 版本,新版本已彻底修复此反人类逻辑。
  3. 其他选择:可尝试严格设置 $HOME\.ssh\authorized_keys 权限为 用户自己 + SYSTEM。
文件编码问题(BOM 导致失败)

现象 :权限正确,路径正确,但依然认证失败。

原因 :Windows 记事本默认保存文件时可能会带上 UTF-8 BOM 头,SSHD 无法解析 BOM 头导致公钥读取失败。

验证与解决

powershell 复制代码
# 验证是否有 BOM 头(如果输出前三字节为 239 187 191,则有 BOM)
$bytes = Get-Content -Path "C:\ProgramData\ssh\administrators_authorized_keys" -Encoding Byte -TotalCount 3
$bytes

# 解决:重新以无 BOM 的 UTF-8 格式保存
$content = Get-Content "C:\ProgramData\ssh\administrators_authorized_keys"
[System.IO.File]::WriteAllText("C:\ProgramData\ssh\administrators_authorized_keys", $content, (New-Object System.Text.UTF8Encoding $false))
开启详细日志与日志查看

当客户端 ssh -v 无法看出问题时,必须查看服务端日志。

  1. 修改配置文件开启详细日志
    编辑 C:\ProgramData\ssh\sshd_config,修改或添加:

    text 复制代码
    SyslogFacility LOCAL0
    LogLevel DEBUG3
  2. 重启服务Restart-Service sshd

  3. 查看日志
    Windows OpenSSH 的日志默认不输出到文件,而是写入 Windows 事件查看器。

    • 打开"事件查看器" -> "应用程序和服务日志" -> "OpenSSH" -> "Operational"。

    • 或者使用 PowerShell 实时查看:

      powershell 复制代码
      Get-WinEvent -LogName "OpenSSH/Operational" -MaxEvents 20 | Format-List TimeCreated, Message

    排障完成后,记得将 LogLevel 改回 INFO 并重启服务。

权限校验与修复命令备忘

在排查权限问题时,以下 PowerShell 命令非常有用:

powershell 复制代码
# 查看文件当前的 ACL 权限
Get-Acl "C:\ProgramData\ssh\administrators_authorized_keys" | Format-List

# 检查用户是否属于 Administrators 组
Get-LocalGroupMember -Group "Administrators" | Where-Object Name -match "你的用户名"

# 一键修复 authorized_keys 权限的脚本片段
$file = "C:\ProgramData\ssh\administrators_authorized_keys"
$acl = Get-Acl $file
$acl.SetAccessRuleProtection($true, $false) # 开启保护,移除继承
$rule1 = New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM","FullControl","Allow")
$rule2 = New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators","FullControl","Allow")
$acl.SetAccessRule($rule1)
$acl.SetAccessRule($rule2)
Set-Acl $file $acl

总结:从 macOS SSH 到 Win10 的核心在于理解 Windows 的 NTFS 权限模型以及旧版 OpenSSH 的管理员特殊逻辑。按照本文的推荐步骤配置,或直接升级到最新版 OpenSSH,即可彻底告别"公钥认证失败"的烦恼。

相关推荐
线上放牧人10 小时前
Windows删除图标缓存
windows·python·pyqt
Koi慢热11 小时前
DayDayMap学术社区体验:卫星网络测绘专题用下来怎么样
网络·人工智能·windows·web安全·网络安全
web守墓人12 小时前
【goed/ui】自定义组件设计思想篇
linux·windows·ui·golang
2601_9623649715 小时前
红外活体模组,Windows 设备安全身份入口解析
windows·安全·电脑
易点云徐源16 小时前
(已解决)Photoshop 2020 点击“选择主体”闪退:不用重装,1 个配置切回旧算法解决
windows·photoshop
云计算练习生16 小时前
什么是系统调用?为什么程序访问硬件必须经过它
linux·windows·操作系统·系统调用·操作系统原理
其实防守也摸鱼1 天前
DeepSeek Harness 开源贡献手记:从入门到合入主线
服务器·数据库·windows·https·ssl
qqww1551 天前
Win11更新后Edge卡顿掉帧?隐私窗口流畅解决办法
windows·edge·优化·卡顿
其实防守也摸鱼1 天前
堆叠注入(Stacked Injection)详解
服务器·数据库·windows·https·ssl