Windows 11 PowerShell 手动配置 SSH 密钥实现 Linux 服务器免密登录

📅 2026/6/24 16:04:45
Windows 11 PowerShell 手动配置 SSH 密钥实现 Linux 服务器免密登录
1. 项目概述与核心价值如果你经常需要在 Windows 11 上通过 PowerShell 连接 Linux 服务器每次输入密码不仅繁琐在自动化脚本或频繁操作时更是效率的“绊脚石”。SSH 密钥认证正是解决这个痛点的标准方案它能让你实现真正的“一键登录”。网上教程很多但往往只讲一种方法或者细节含糊导致新手在 Windows 环境下特别是 PowerShell 中操作时总会遇到各种“坑”比如权限问题、路径错误、服务配置不对等。这个项目就是聚焦于在 Windows 11 的 PowerShell 环境中通过手动复制公钥即所谓的“方法2”来配置 SSH 密钥对最终实现免密码访问 Linux 服务器。为什么强调“方法2”和“手动复制”因为这是最通用、最可控、最能让你理解背后原理的方式。它不依赖于某些图形化工具可能存在的兼容性问题也不依赖ssh-copy-id命令该命令在 Windows 原生 PowerShell 中默认不可用而是让你亲手完成从密钥生成、本地配置到服务器端部署的全过程。掌握它意味着你彻底理解了 SSH 密钥认证的链路以后在任何环境下都能举一反三。接下来我会以一个资深运维和开发者的视角带你走一遍完整的流程。我会解释每一个步骤背后的“为什么”分享那些官方文档不会写的“踩坑”心得并提供可以直接复制粘贴的命令和配置。无论你是刚接触 Linux 的开发者还是需要频繁管理服务器的运维人员这篇指南都能让你在 Windows 11 上建立起稳定、高效的 SSH 密钥访问通道。2. 核心原理SSH 密钥认证是如何工作的在动手之前花几分钟理解原理至关重要这能帮你从根本上排查未来可能遇到的问题。SSH 密钥认证基于非对称加密体系核心是一对密钥私钥和公钥。私钥相当于你的“主钥匙”或“身份证”必须绝对保密存放在你的本地客户端机器上也就是你的 Win11 电脑。我们通常不对它设置密码passphrase以实现完全的无交互登录但这样会降低安全性。为了兼顾可以为私钥设置一个强密码然后通过ssh-agent代理在单次会话中记住它这也是常见的实践。公钥相当于一把“公开的锁”可以放心地放在任何你想访问的服务器上。它的内容本身就是公开信息即使被他人看到也无法反向推导出私钥。认证流程你从本地客户端发起 SSH 连接请求到服务器。服务器检查对应用户的~/.ssh/authorized_keys文件发现里面有你的公钥。服务器生成一个随机字符串Challenge并用你留下的公钥进行加密然后将这个加密后的数据发回给你的客户端。你的客户端收到后使用本地存储的私钥进行解密。客户端将解密出的原始随机字符串再次计算一个哈希值HMAC发回给服务器。服务器自己也用原始随机字符串计算一次哈希值并与客户端返回的进行比对。如果一致则证明客户端拥有对应的私钥认证通过。整个过程你的私钥从未离开过你的电脑。因此配置的关键就两步在本地生成密钥对并妥善保管私钥将公钥内容准确无误地放置到服务器的指定位置。我们采用的“手动复制”方法就是精确控制第二步的过程。注意很多连接失败问题都出在服务器端的authorized_keys文件权限或内容格式上。手动操作能让你清晰地看到并控制这些细节。3. 环境准备与工具确认工欲善其事必先利其器。在 Win11 上操作我们需要确保环境就绪。3.1 确认 Windows 11 的 OpenSSH 客户端从 Windows 10 1809 版本和 Windows Server 2019 开始OpenSSH 客户端已作为可选功能内置。Win11 通常默认已安装。我们来检查并确认。以管理员身份打开 PowerShell。在开始菜单搜索“PowerShell”右键点击“Windows PowerShell”或“Windows Terminal”选择“以管理员身份运行”。使用管理员权限可以避免后续一些权限错误。检查 SSH 客户端版本。在 PowerShell 中输入以下命令ssh -V你会看到类似OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2的输出。只要有版本信息就说明客户端已安装。如果未安装安装 OpenSSH 客户端。如果上一步命令报错或找不到则需要安装# 首先检查可用功能 Get-WindowsCapability -Online | Where-Object Name -like OpenSSH.Client* # 安装客户端 Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0安装完成后可能需要重启 PowerShell 窗口。3.2 准备 Linux 服务器端信息你需要知道以下信息服务器 IP 地址或域名例如192.168.1.100或example.com。登录用户名你打算用哪个用户身份免密登录例如ubuntu,root,deploy等。该用户的密码在初次配置公钥时我们还需要用密码登录一次。把这些信息记下来后面会用到。3.3 关于 PowerShell 与命令提示符 (CMD) 的区分本项目全程使用PowerShell。它的功能更强大语法更接近 Linux Shell并且是 Win11 上重点推广的命令行环境。避免使用传统的 CMD因为路径和命令语法差异可能导致不必要的麻烦。在后续所有命令中如果遇到路径请注意 PowerShell 的路径分隔符是反斜杠\但在 SSH 相关配置中我们更多使用正斜杠/风格的路径尤其是在类 Unix 的上下文里。4. 本地生成 SSH 密钥对这是整个流程的起点。我们将在你的 Win11 电脑上生成专属的密钥对。4.1 生成密钥的命令与参数解析打开 PowerShell普通用户权限即可无需管理员。我们将使用ssh-keygen命令。一个典型且推荐的命令如下ssh-keygen -t rsa -b 4096 -C your_emailexample.com让我们拆解每个参数-t rsa指定密钥类型为 RSA。这是最广泛支持的算法。你也可以使用-t ed25519它更安全、更快但一些老旧的系统可能不支持。对于绝大多数现代 Linux 发行版RSA 4096 是稳妥的选择。-b 4096指定密钥长度为 4096 位。2048 位是旧标准4096 位提供了更强的安全性是目前的新推荐。长度越长暴力破解越困难但生成和验证稍慢可忽略不计。-C comment为密钥添加一个注释。通常用你的邮箱标识这个密钥的归属方便日后管理。这个注释会保存在公钥文件的末尾不影响功能。4.2 执行过程与关键选择运行上述命令后你会看到交互式提示“Enter file in which to save the key”询问私钥保存路径和文件名。默认是C:\Users\你的用户名\.ssh\id_rsa。我强烈建议直接按回车使用默认路径和文件名。因为 SSH 客户端默认会去这个位置查找私钥使用非默认名称需要额外配置对新手不友好。如果你之前已经存在id_rsa文件它会询问是否覆盖。请谨慎选择。“Enter passphrase”为私钥设置一个密码。这是可选的。如果直接回车留空则私钥无密码实现完全免交互登录但私钥文件一旦泄露服务器就门户大开。我建议输入一个强密码。这会在每次使用私钥时要求输入密码似乎违背了“免密码”的初衷别急我们可以用ssh-agent来解决。先设置密码后面教你怎么让系统在一次登录会话中记住它。这样即使私钥文件被盗攻击者没有密码也无法使用。如果你确信电脑物理安全且仅用于测试或低风险环境可以留空。“Enter same passphrase again”确认密码。命令执行成功后你会在C:\Users\你的用户名\.ssh\目录下看到两个新文件id_rsa这是你的私钥。文件权限应该非常严格系统会自动设置。切勿将此文件发给任何人或上传到任何地方id_rsa.pub这是你的公钥。它的内容就是我们要复制到服务器上的东西。你可以用文本编辑器打开它查看内容是一长串以ssh-rsa AAAAB3Nza...开头的文本。4.3 实操心得密钥管理建议备份私钥将整个.ssh目录尤其是id_rsa和id_rsa.pub备份到安全的离线存储介质如加密的 U 盘。重装系统或更换电脑时会用到。多密钥对管理如果你需要连接不同安全级别的服务器如公司生产服务器、个人 VPS、GitHub可以为不同用途生成不同密钥对例如id_rsa_github,id_rsa_work。生成时指定不同的文件名即可在第一步输入时修改。但这需要额外的 SSH 客户端配置~/.ssh/config我们本次聚焦基础流程暂不展开。注释的重要性使用-C参数添加有意义的注释例如-C laptop-win11-2024。一年后当你查看authorized_keys文件里一堆公钥时就知道哪个对应哪台机器了。5. 手动复制公钥到 Linux 服务器核心步骤这是“方法2”的精髓也是最能体现你控制力的环节。我们分为两个阶段首先用密码登录服务器然后手动创建并配置授权文件。5.1 第一阶段使用密码 SSH 登录服务器在 PowerShell 中使用你的用户名和服务器地址进行初次登录ssh usernameserver_ip例如ssh ubuntu192.168.1.100如果是第一次连接这台服务器会提示你确认服务器的指纹RSA key fingerprint输入yes继续。然后输入对应用户的密码。登录成功后你会进入服务器的命令行界面。5.2 第二阶段在服务器上配置 authorized_keys现在你已经在 Linux 服务器的终端里了。我们需要在用户的家目录下创建或修改.ssh/authorized_keys文件。确保.ssh目录存在且权限正确。逐条执行以下命令# 切换到用户家目录如果不在的话 cd ~ # 创建 .ssh 目录如果已存在则无影响 mkdir -p ~/.ssh # 设置 .ssh 目录的权限为 700 (rwx------) # 这意味着只有目录所有者可以读、写、执行进入 chmod 700 ~/.sshmkdir -p中的-p参数确保如果目录已存在也不会报错。创建或编辑authorized_keys文件。我们将从本地 Win11 机器复制公钥内容然后粘贴到服务器的这个文件里。首先回到你的 Win11 PowerShell 窗口新开一个标签页或窗口不要关闭服务器的连接。使用cat命令查看并复制你的公钥内容cat ~/.ssh/id_rsa.pubPowerShell 会输出你的公钥内容是一行以ssh-rsa开头以你的注释结尾的长字符串。用鼠标完整地选中这一整行包括开头的 ssh-rsa 和结尾的注释然后按CtrlC复制。现在切换回连接着服务器的那个 PowerShell 窗口或终端。使用nano或vim编辑器打开或创建authorized_keys文件。这里以nano为例更简单nano ~/.ssh/authorized_keys如果文件是空的直接将光标放在开头。如果文件已有内容将光标移动到最后一行末尾确保在新的一行。按CtrlShiftV在大多数终端中这是粘贴的快捷键将你刚才复制的公钥内容粘贴进来。检查粘贴的内容确保它是完整的一行没有多余的空格、换行符在行中并且末尾是你的邮箱注释。这是最常见的错误来源——粘贴时多了换行或空格。按CtrlO写入文件回车确认文件名然后按CtrlX退出 nano。设置authorized_keys文件的权限。这一步极其关键权限不对 SSH 会出于安全考虑直接拒绝使用密钥登录。chmod 600 ~/.ssh/authorized_keys这个600权限-rw-------意味着只有文件所有者可以读写其他任何用户都无权访问。5.3 关键原理为什么权限如此重要SSH 协议非常注重安全。如果~/.ssh目录或~/.ssh/authorized_keys文件的权限过于开放例如允许同组用户或其他用户写入那么恶意用户就有可能篡改你的授权文件从而植入他自己的公钥。为了防止这种情况SSH 守护进程sshd在发现这些关键文件或目录的权限不正确时会直接记录一条警告日志并拒绝公钥认证。你会看到类似“Permission denied (publickey)”的错误但根本原因不是密钥不对而是权限问题。所以请牢记~/.ssh目录权限必须是700(drwx------)~/.ssh/authorized_keys文件权限必须是600(-rw-------)~/.ssh目录的所有者必须是当前用户不能是 root除非你就是用 root 用户配置的。6. 本地 SSH 客户端配置与测试服务器端配置好了现在回到 Win11 本地进行最终的连接测试和体验优化。6.1 首次免密码登录测试在 PowerShell 中再次尝试连接你的服务器ssh usernameserver_ip例如ssh ubuntu192.168.1.100如果一切配置正确你应该会直接登录成功而不再被询问密码。这就是我们想要的效果6.2 使用 ssh-agent 管理私钥密码可选但推荐如果你在生成密钥时设置了密码Passphrase那么每次连接时仍然需要输入这个密码这并没有实现完全的“免交互”。ssh-agent是一个密钥管理守护进程它可以帮你在一段时间内例如整个 PowerShell 会话期间记住解密的私钥。确保 ssh-agent 服务正在运行。在 PowerShell 中# 检查 ssh-agent 服务状态 Get-Service ssh-agent # 如果状态不是 Running则启动它需要管理员权限 Start-Service ssh-agent # 设置服务为自动启动可选建议做 Set-Service -Name ssh-agent -StartupType Automatic如果你没有管理员权限可以以用户模式启动代理ssh-agent但每次重启会话都需要重新启动。将私钥添加到 ssh-agentssh-add ~/.ssh/id_rsa执行这个命令后它会提示你输入一次私钥的密码。输入正确后该私钥就被ssh-agent缓存了。在此次 PowerShell 会话期间或者直到你关闭它或手动移除密钥你再使用ssh连接时都不会再被要求输入私钥密码。验证密钥已添加ssh-add -l这会列出当前被ssh-agent管理的所有密钥的指纹。实操心得对于日常使用的电脑将ssh-agent设为自动启动并在开机后第一次打开 PowerShell 时运行一次ssh-add输入密码之后一整天的工作都会非常顺畅。这既保证了私钥有密码保护的安全性又获得了无密码登录的便利性。6.3 进阶配置 SSH Config 文件简化连接如果你需要连接多台服务器或者觉得每次输入usernameserver_ip很麻烦可以配置本地的~/.ssh/config文件。在 PowerShell 中用记事本或 VS Code 打开或创建这个文件notepad $HOME\.ssh\config或者用 VS Codecode $HOME\.ssh\config添加以下配置内容示例Host myserver # 一个简短的别名你可以自定义 HostName 192.168.1.100 # 服务器的实际 IP 或域名 User ubuntu # 登录用户名 IdentityFile ~/.ssh/id_rsa # 指定使用的私钥路径如果你有多个密钥对这里就很有用 # Port 22 # 如果 SSH 服务不是默认的 22 端口取消注释并修改保存文件。之后你就可以直接使用别名连接了ssh myserverSSH 会自动使用配置中指定的主机名、用户名和私钥极大简化了命令。7. 故障排查与常见问题实录即使按照步骤操作也可能会遇到问题。这里我汇总了最常见的几种错误及其解决方法都是实战中踩过的坑。7.1 错误Permission denied (publickey)这是最典型的错误。意味着 SSH 客户端尝试了公钥认证但服务器拒绝了。请按以下顺序排查检查服务器端文件权限这是最常见的原因。重新登录服务器确保ls -la ~/.ssh/查看输出确认.ssh目录权限是drwx------(700)。authorized_keys文件权限是-rw-------(600)。所有者和组都是你当前登录的用户。 如果不符用chmod命令修正。检查公钥内容确认你粘贴到authorized_keys文件里的公钥是完整、正确的一行。在服务器上执行cat ~/.ssh/authorized_keys看看你的公钥是否在里面格式是否正确开头是ssh-rsa AAA...中间没有换行。可以尝试手动编辑删除可能的空行或多余空格。检查 SSH 服务配置极少数情况下服务器可能禁用了公钥认证。检查/etc/ssh/sshd_config文件需要 root 权限sudo cat /etc/ssh/sshd_config | grep PubkeyAuthentication确保输出是PubkeyAuthentication yes。如果不是需要修改并重启 SSH 服务 (sudo systemctl restart sshd)。此操作有风险请谨慎。启用客户端详细模式在本地连接时添加-v参数可以查看详细的调试信息帮助定位问题在哪一步ssh -v usernameserver_ip仔细阅读输出看在哪一步失败了。7.2 错误Could not open a connection to your authentication agent.当你运行ssh-add时出现此错误说明ssh-agent没有运行。按照前面第 6.2 节的步骤启动它。7.3 错误Load key “C:\Users\...\.ssh\id_rsa“: invalid format这通常意味着私钥文件的格式不对。可能的原因文件被损坏。文件是用其他工具如 PuTTY 的puttygen生成的其格式PPK与 OpenSSH 不兼容。OpenSSH 使用的是一种称为 PEM 的格式。解决方法使用ssh-keygen重新生成密钥对。或者如果你确实有 PPK 格式的密钥需要用puttygen工具将其转换为 OpenSSH 格式。7.4 连接缓慢或卡顿有时连接建立很慢可能发生在“authenticating”阶段。这通常是因为 SSH 服务端在尝试多种认证方式如 GSSAPI。可以在客户端配置文件中禁用这些不常用的方式 在你的~/.ssh/config文件对应 Host 下添加GSSAPIAuthentication no7.5 排查流程速查表问题现象可能原因排查步骤Permission denied (publickey)1. 服务器文件权限错误2. 公钥未正确添加3. 服务端禁用公钥认证1.ls -la ~/.ssh检查权限 (700, 600)2.cat ~/.ssh/authorized_keys检查内容3.ssh -v查看详细日志确认认证流程仍需输入密码1. 私钥路径不对2. ssh-agent 未加载密钥3. 服务器authorized_keys文件错误1. 确认ssh命令使用的用户/IP 正确2. 运行ssh-add -l查看已加载密钥3. 服务器端仔细核对公钥文件连接超时/被拒绝1. 网络不通2. 服务器 IP/端口错误3. 服务器防火墙阻止1.ping server_ip测试连通性2. 确认 SSH 服务正在运行 (sudo systemctl status sshd)3. 检查服务器防火墙规则8. 安全加固与最佳实践实现免密码登录后安全不能松懈。这里提供几个提升安全性的建议。禁用密码登录高风险操作务必谨慎一旦确认密钥登录稳定可靠你可以在服务器上禁用密码认证这样攻击者就无法通过暴力破解密码来入侵。编辑/etc/ssh/sshd_configsudo nano /etc/ssh/sshd_config找到PasswordAuthentication这一行将其改为no。同时确保PubkeyAuthentication是yes。警告在禁用密码登录前必须确保你的公钥登录 100% 工作正常并且你有其他方式如控制台能访问服务器。否则一旦密钥出问题你将无法登录修改后重启 SSH 服务sudo systemctl restart sshd。使用强密码保护私钥如前所述即使使用ssh-agent也应为私钥设置一个强密码。这是防止私钥文件泄露后的最后一道防线。为私钥文件设置严格的 NTFS 权限Windows虽然生成时系统会设置但可以手动确认。在文件资源管理器中右键点击id_rsa文件 - 属性 - 安全确保只有你的用户账户有完全控制权其他用户和组都应无权限。定期轮换密钥就像改密码一样可以每隔一段时间如一年生成一对新的密钥替换掉服务器上旧的公钥。管理多台服务器时可以使用ssh-copy-id命令的 Linux 版本来批量部署或者在 Ansible 等自动化工具中管理。使用非标准 SSH 端口修改服务器的 SSH 端口如从 22 改为 2222可以减少自动化扫描工具的攻击。在sshd_config中修改Port项并在防火墙中放行新端口。客户端连接时使用ssh -p 2222 usernameserver_ip或在 SSH config 中指定Port。整个流程走下来从生成密钥到安全加固你已经掌握了在 Win11 PowerShell 环境下通过手动方式配置 SSH 密钥登录的完整技能。这个方法虽然步骤稍多但每一步都清晰可见出了问题也容易排查。它不依赖于任何外部工具是跨平台、最本质的解决方案。下次当你需要为新的服务器配置免密登录时这套流程将会成为你的肌肉记忆。