尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

Windows 11 PowerShell 手动配置 SSH 密钥实现 Linux 服务器免密登录
📅 发布时间:2026/6/24 16:20:59

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代理在单次会话中记住它,这也是常见的实践。

公钥:相当于一把“公开的锁”,可以放心地放在任何你想访问的服务器上。它的内容本身就是公开信息,即使被他人看到也无法反向推导出私钥。

认证流程:

  1. 你从本地(客户端)发起 SSH 连接请求到服务器。
  2. 服务器检查对应用户的~/.ssh/authorized_keys文件,发现里面有你的公钥。
  3. 服务器生成一个随机字符串(Challenge),并用你留下的公钥进行加密,然后将这个加密后的数据发回给你的客户端。
  4. 你的客户端收到后,使用本地存储的私钥进行解密。
  5. 客户端将解密出的原始随机字符串再次计算一个哈希值(HMAC),发回给服务器。
  6. 服务器自己也用原始随机字符串计算一次哈希值,并与客户端返回的进行比对。如果一致,则证明客户端拥有对应的私钥,认证通过。

整个过程,你的私钥从未离开过你的电脑。因此,配置的关键就两步:在本地生成密钥对并妥善保管私钥;将公钥内容准确无误地放置到服务器的指定位置。我们采用的“手动复制”方法,就是精确控制第二步的过程。

注意:很多连接失败,问题都出在服务器端的authorized_keys文件权限或内容格式上。手动操作能让你清晰地看到并控制这些细节。

3. 环境准备与工具确认

工欲善其事,必先利其器。在 Win11 上操作,我们需要确保环境就绪。

3.1 确认 Windows 11 的 OpenSSH 客户端

从 Windows 10 1809 版本和 Windows Server 2019 开始,OpenSSH 客户端已作为可选功能内置。Win11 通常默认已安装。我们来检查并确认。

  1. 以管理员身份打开 PowerShell。在开始菜单搜索“PowerShell”,右键点击“Windows PowerShell”或“Windows Terminal”,选择“以管理员身份运行”。使用管理员权限可以避免后续一些权限错误。
  2. 检查 SSH 客户端版本。在 PowerShell 中输入以下命令:
    ssh -V
    你会看到类似OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2的输出。只要有版本信息,就说明客户端已安装。
  3. (如果未安装)安装 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_email@example.com"

让我们拆解每个参数:

  • -t rsa:指定密钥类型为 RSA。这是最广泛支持的算法。你也可以使用-t ed25519,它更安全、更快,但一些老旧的系统可能不支持。对于绝大多数现代 Linux 发行版,RSA 4096 是稳妥的选择。
  • -b 4096:指定密钥长度为 4096 位。2048 位是旧标准,4096 位提供了更强的安全性,是目前的新推荐。长度越长,暴力破解越困难,但生成和验证稍慢(可忽略不计)。
  • -C "comment":为密钥添加一个注释。通常用你的邮箱标识这个密钥的归属,方便日后管理。这个注释会保存在公钥文件的末尾,不影响功能。

4.2 执行过程与关键选择

运行上述命令后,你会看到交互式提示:

  1. “Enter file in which to save the key”:询问私钥保存路径和文件名。

    • 默认是C:\Users\<你的用户名>\.ssh\id_rsa。我强烈建议直接按回车使用默认路径和文件名。因为 SSH 客户端默认会去这个位置查找私钥,使用非默认名称需要额外配置,对新手不友好。
    • 如果你之前已经存在id_rsa文件,它会询问是否覆盖。请谨慎选择。
  2. “Enter passphrase”:为私钥设置一个密码。

    • 这是可选的。如果直接回车留空,则私钥无密码,实现完全免交互登录,但私钥文件一旦泄露,服务器就门户大开。
    • 我建议:输入一个强密码。这会在每次使用私钥时要求输入密码,似乎违背了“免密码”的初衷?别急,我们可以用ssh-agent来解决。先设置密码,后面教你怎么让系统在一次登录会话中记住它。这样即使私钥文件被盗,攻击者没有密码也无法使用。
    • 如果你确信电脑物理安全,且仅用于测试或低风险环境,可以留空。
  3. “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 username@server_ip

例如:ssh ubuntu@192.168.1.100

如果是第一次连接这台服务器,会提示你确认服务器的指纹(RSA key fingerprint),输入yes继续。然后输入对应用户的密码。登录成功后,你会进入服务器的命令行界面。

5.2 第二阶段:在服务器上配置 authorized_keys

现在,你已经在 Linux 服务器的终端里了。我们需要在用户的家目录下创建或修改.ssh/authorized_keys文件。

  1. 确保.ssh目录存在且权限正确。逐条执行以下命令:

    # 切换到用户家目录(如果不在的话) cd ~ # 创建 .ssh 目录,如果已存在则无影响 mkdir -p ~/.ssh # 设置 .ssh 目录的权限为 700 (rwx------) # 这意味着只有目录所有者可以读、写、执行(进入) chmod 700 ~/.ssh

    mkdir -p中的-p参数确保如果目录已存在也不会报错。

  2. 创建或编辑authorized_keys文件。我们将从本地 Win11 机器复制公钥内容,然后粘贴到服务器的这个文件里。

    • 首先,回到你的 Win11 PowerShell 窗口(新开一个标签页或窗口,不要关闭服务器的连接)。

    • 使用cat命令查看并复制你的公钥内容:

      cat ~/.ssh/id_rsa.pub

      PowerShell 会输出你的公钥,内容是一行以ssh-rsa开头,以你的注释结尾的长字符串。用鼠标完整地选中这一整行(包括开头的 ssh-rsa 和结尾的注释),然后按Ctrl+C复制。

    • 现在,切换回连接着服务器的那个 PowerShell 窗口(或终端)。

    • 使用nano或vim编辑器打开(或创建)authorized_keys文件。这里以nano为例(更简单):

      nano ~/.ssh/authorized_keys
    • 如果文件是空的,直接将光标放在开头。如果文件已有内容,将光标移动到最后一行末尾(确保在新的一行)。

    • 按Ctrl+Shift+V(在大多数终端中,这是粘贴的快捷键)将你刚才复制的公钥内容粘贴进来。

    • 检查粘贴的内容:确保它是完整的一行,没有多余的空格、换行符在行中,并且末尾是你的邮箱注释。这是最常见的错误来源——粘贴时多了换行或空格。

    • 按Ctrl+O写入文件,回车确认文件名,然后按Ctrl+X退出 nano。

  3. 设置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 username@server_ip

例如:ssh ubuntu@192.168.1.100

如果一切配置正确,你应该会直接登录成功,而不再被询问密码。这就是我们想要的效果!

6.2 使用 ssh-agent 管理私钥密码(可选但推荐)

如果你在生成密钥时设置了密码(Passphrase),那么每次连接时仍然需要输入这个密码,这并没有实现完全的“免交互”。ssh-agent是一个密钥管理守护进程,它可以帮你在一段时间内(例如整个 PowerShell 会话期间)记住解密的私钥。

  1. 确保 ssh-agent 服务正在运行。在 PowerShell 中:

    # 检查 ssh-agent 服务状态 Get-Service ssh-agent # 如果状态不是 Running,则启动它(需要管理员权限) Start-Service ssh-agent # 设置服务为自动启动(可选,建议做) Set-Service -Name ssh-agent -StartupType Automatic

    如果你没有管理员权限,可以以用户模式启动代理:ssh-agent,但每次重启会话都需要重新启动。

  2. 将私钥添加到 ssh-agent:

    ssh-add ~/.ssh/id_rsa

    执行这个命令后,它会提示你输入一次私钥的密码。输入正确后,该私钥就被ssh-agent缓存了。在此次 PowerShell 会话期间(或者直到你关闭它或手动移除密钥),你再使用ssh连接时,都不会再被要求输入私钥密码。

  3. 验证密钥已添加:

    ssh-add -l

    这会列出当前被ssh-agent管理的所有密钥的指纹。

实操心得:对于日常使用的电脑,将ssh-agent设为自动启动,并在开机后第一次打开 PowerShell 时运行一次ssh-add输入密码,之后一整天的工作都会非常顺畅。这既保证了私钥有密码保护的安全性,又获得了无密码登录的便利性。

6.3 (进阶)配置 SSH Config 文件简化连接

如果你需要连接多台服务器,或者觉得每次输入username@server_ip很麻烦,可以配置本地的~/.ssh/config文件。

  1. 在 PowerShell 中,用记事本或 VS Code 打开(或创建)这个文件:

    notepad $HOME\.ssh\config

    或者用 VS Code:code $HOME\.ssh\config

  2. 添加以下配置内容(示例):

    Host myserver # 一个简短的别名,你可以自定义 HostName 192.168.1.100 # 服务器的实际 IP 或域名 User ubuntu # 登录用户名 IdentityFile ~/.ssh/id_rsa # 指定使用的私钥路径(如果你有多个密钥对,这里就很有用) # Port 22 # 如果 SSH 服务不是默认的 22 端口,取消注释并修改
  3. 保存文件。之后,你就可以直接使用别名连接了:

    ssh myserver

    SSH 会自动使用配置中指定的主机名、用户名和私钥,极大简化了命令。

7. 故障排查与常见问题实录

即使按照步骤操作,也可能会遇到问题。这里我汇总了最常见的几种错误及其解决方法,都是实战中踩过的坑。

7.1 错误:Permission denied (publickey)

这是最典型的错误。意味着 SSH 客户端尝试了公钥认证,但服务器拒绝了。请按以下顺序排查:

  1. 检查服务器端文件权限:这是最常见的原因。重新登录服务器,确保:

    ls -la ~/.ssh/

    查看输出,确认:

    • .ssh目录权限是drwx------(700)。
    • authorized_keys文件权限是-rw-------(600)。
    • 所有者和组都是你当前登录的用户。 如果不符,用chmod命令修正。
  2. 检查公钥内容:确认你粘贴到authorized_keys文件里的公钥是完整、正确的一行。在服务器上执行:

    cat ~/.ssh/authorized_keys

    看看你的公钥是否在里面,格式是否正确(开头是ssh-rsa AAA...,中间没有换行)。可以尝试手动编辑,删除可能的空行或多余空格。

  3. 检查 SSH 服务配置:极少数情况下,服务器可能禁用了公钥认证。检查/etc/ssh/sshd_config文件(需要 root 权限):

    sudo cat /etc/ssh/sshd_config | grep PubkeyAuthentication

    确保输出是PubkeyAuthentication yes。如果不是,需要修改并重启 SSH 服务 (sudo systemctl restart sshd)。此操作有风险,请谨慎。

  4. 启用客户端详细模式:在本地连接时添加-v参数,可以查看详细的调试信息,帮助定位问题在哪一步:

    ssh -v username@server_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 no

7.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. 安全加固与最佳实践

实现免密码登录后,安全不能松懈。这里提供几个提升安全性的建议。

  1. 禁用密码登录(高风险操作,务必谨慎):一旦确认密钥登录稳定可靠,你可以在服务器上禁用密码认证,这样攻击者就无法通过暴力破解密码来入侵。编辑/etc/ssh/sshd_config:

    sudo nano /etc/ssh/sshd_config

    找到PasswordAuthentication这一行,将其改为no。同时,确保PubkeyAuthentication是yes。警告:在禁用密码登录前,必须确保你的公钥登录 100% 工作正常,并且你有其他方式(如控制台)能访问服务器。否则一旦密钥出问题,你将无法登录!修改后重启 SSH 服务:sudo systemctl restart sshd。

  2. 使用强密码保护私钥:如前所述,即使使用ssh-agent,也应为私钥设置一个强密码。这是防止私钥文件泄露后的最后一道防线。

  3. 为私钥文件设置严格的 NTFS 权限(Windows):虽然生成时系统会设置,但可以手动确认。在文件资源管理器中右键点击id_rsa文件 -> 属性 -> 安全,确保只有你的用户账户有完全控制权,其他用户和组都应无权限。

  4. 定期轮换密钥:就像改密码一样,可以每隔一段时间(如一年)生成一对新的密钥,替换掉服务器上旧的公钥。管理多台服务器时,可以使用ssh-copy-id命令的 Linux 版本来批量部署,或者在 Ansible 等自动化工具中管理。

  5. 使用非标准 SSH 端口:修改服务器的 SSH 端口(如从 22 改为 2222),可以减少自动化扫描工具的攻击。在sshd_config中修改Port项,并在防火墙中放行新端口。客户端连接时使用ssh -p 2222 username@server_ip或在 SSH config 中指定Port。

整个流程走下来,从生成密钥到安全加固,你已经掌握了在 Win11 PowerShell 环境下通过手动方式配置 SSH 密钥登录的完整技能。这个方法虽然步骤稍多,但每一步都清晰可见,出了问题也容易排查。它不依赖于任何外部工具,是跨平台、最本质的解决方案。下次当你需要为新的服务器配置免密登录时,这套流程将会成为你的肌肉记忆。

相关新闻

  • OpenClaw可视化AI工作流编排平台部署指南
  • YOLOv8 Windows安装部署实操指南:避坑、版本锚定与CUDA对齐
  • OpenClaw本地AI运行时:飞书机器人背后的本地化AI操作系统

最新新闻

  • 用ChatGPT做英语沉浸式训练:从pocket到语义网络的AI精练法
  • AI Agent服务化实战:从对话接口到商业分发平台
  • Pikachu靶场实战指南:从SQL注入到XSS的Web渗透入门
  • OpenClaw CN Windows原生部署全指南:从安装到服务化
  • 华为eNSP防火墙Web界面配置实战:从零搭建管理环境
  • HEIC转JPG实战指南:解码稳定性、色彩还原与隐私安全全解析

日新闻

  • 终极指南:如何用shadPS4在电脑上免费畅玩PS4游戏
  • 打造个性化Instagram Clone:主题定制与用户体验优化技巧
  • 未来展望:RoseTTAFold-All-Atom的发展路线图与社区支持资源汇总

周新闻

  • Visual C++运行库修复终极指南:5分钟快速解决Windows软件启动错误
  • 手把手教你构建统计局地区经济数据爬虫:从环境搭建到数据持久化全指南
  • 2026多Agent深度解析:用AI团队替代单一模型,四种架构实战落地

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号