news 2026/6/24 16:04:24

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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代理在单次会话中记住它,这也是常见的实践。

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

认证流程

  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.100example.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_rsaid_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 窗口(或终端)。

    • 使用nanovim编辑器打开(或创建)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。同时,确保PubkeyAuthenticationyes警告:在禁用密码登录前,必须确保你的公钥登录 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 密钥登录的完整技能。这个方法虽然步骤稍多,但每一步都清晰可见,出了问题也容易排查。它不依赖于任何外部工具,是跨平台、最本质的解决方案。下次当你需要为新的服务器配置免密登录时,这套流程将会成为你的肌肉记忆。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/24 15:56:34

DeepSeek与通义千问:推理优先vs感知优先的多模态技术选型指南

1. 这不是“谁更强”的站队游戏&#xff0c;而是两条技术路径的生存逻辑 最近在几个AI工程师闭门群里&#xff0c;几乎每天都有人甩出一张截图&#xff1a;左边是DeepSeek-VL在图文检索任务上92.3%的准确率&#xff0c;右边是通义千问Qwen2-VL在跨模态推理测试中对复杂指令的理…

作者头像 李华
网站建设 2026/6/24 14:11:52

REL分页实现完全指南:高效处理大数据集查询

REL分页实现完全指南&#xff1a;高效处理大数据集查询 【免费下载链接】rel :gem: Modern ORM for Golang - Testable, Extendable and Crafted Into a Clean and Elegant API 项目地址: https://gitcode.com/gh_mirrors/re/rel 在现代Web应用中&#xff0c;处理大数据…

作者头像 李华
网站建设 2026/6/24 14:10:33

zpdf Python绑定教程:轻松实现高性能PDF文本提取

zpdf Python绑定教程&#xff1a;轻松实现高性能PDF文本提取 【免费下载链接】zpdf Zero-copy PDF text extraction library written in Zig. High-performance, memory-mapped parsing with SIMD acceleration. 项目地址: https://gitcode.com/gh_mirrors/zp/zpdf zpdf…

作者头像 李华
网站建设 2026/6/24 14:04:11

PixLoc部署教程:从本地环境到云端服务的完整实现方案

PixLoc部署教程&#xff1a;从本地环境到云端服务的完整实现方案 【免费下载链接】pixloc Back to the Feature: Learning Robust Camera Localization from Pixels to Pose (CVPR 2021) 项目地址: https://gitcode.com/gh_mirrors/pi/pixloc PixLoc是一款基于深度学习的…

作者头像 李华
网站建设 2026/6/24 13:59:17

如何在浏览器中免费使用本地AI模型:Page Assist完整指南

如何在浏览器中免费使用本地AI模型&#xff1a;Page Assist完整指南 【免费下载链接】page-assist Use your locally running AI models to assist you in your web browsing 项目地址: https://gitcode.com/GitHub_Trending/pa/page-assist Page Assist是一款创新的开源…

作者头像 李华