news 2026/7/4 13:49:42

Windows生成SSH密钥实现Linux服务器免密登录完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows生成SSH密钥实现Linux服务器免密登录完整指南

1. 项目概述:告别密码,拥抱密钥

如果你还在为每次连接Linux服务器都要输入一长串密码而烦恼,或者担心密码在网络上传输不够安全,那么是时候了解一下SSH密钥认证了。这几乎是每一位运维工程师、开发者和系统管理员都必须掌握的“生存技能”。简单来说,它就是用一对数学上关联的“钥匙”和“锁”来代替传统的用户名密码。你在本地Windows电脑上生成一对密钥(一把私钥,一把公钥),然后把公钥“锁”放到Linux服务器上。下次连接时,你的Windows电脑用私钥“钥匙”去开锁,匹配成功就直接放行,整个过程无需输入密码,既安全又高效。

我见过太多同事因为不熟悉这个过程,要么继续忍受繁琐的密码输入,要么在配置过程中踩坑,导致连接失败。其实,从Windows 10/11和Windows Server 2019开始,微软已经将OpenSSH客户端集成到了系统中,我们不再需要安装第三方工具(如PuTTY)就能完成所有操作。这篇文章,我将带你从零开始,手把手完成在Windows上生成无密码SSH密钥,并将其配置到Linux服务器的全过程。无论你是刚接触Linux的新手,还是想优化工作流的老手,这篇指南都能让你在10分钟内搞定这个配置,一劳永逸。

2. 核心原理:为什么密钥比密码更安全、更方便?

在动手之前,我们花几分钟搞清楚背后的原理,这能帮你理解每一步操作的意义,甚至在出问题时知道从哪里排查。

2.1 非对称加密:钥匙与锁的哲学

SSH密钥认证的核心是非对称加密算法。你可以把它想象成一把特制的锁和钥匙:

  • 公钥:就是那把“锁”。你可以把它复制给任何人,甚至公开张贴。它的作用就是“加密”和“验证”。在SSH场景里,我们把它放在服务器上。
  • 私钥:就是唯一的“钥匙”。你必须像保护银行密码一样保护它,绝不能泄露。它的作用是“解密”和“签名”。

当你的客户端(Windows)尝试连接服务器(Linux)时,会发生以下“对话”:

  1. 客户端说:“你好,我是用户alice,我想用密钥登录。”
  2. 服务器找到用户alice家目录下的“锁”(公钥),生成一段随机挑战信息,并用这把“锁”加密,然后发给客户端。
  3. 客户端收到加密的挑战信息后,使用自己持有的唯一“钥匙”(私钥)进行解密。
  4. 客户端将解密后的原始挑战信息进行某种处理(如与会话ID混合哈希),再用私钥签名,将结果发回服务器。
  5. 服务器用存储的“锁”(公钥)验证这个签名。如果验证通过,就证明客户端确实拥有对应的私钥,身份认证成功。

这个过程完全不需要在网络上传输私钥,也无需输入密码(除非你为私钥设置了额外的通行短语)。安全性远高于每次都在网络上传输可被截获的密码。

2.2 无密码密钥 vs. 带通行短语的密钥

在生成密钥时,系统会询问你是否设置一个“通行短语”。这里有两个选择:

  • 设置通行短语:为私钥再加一层密码保护。即使私钥文件被盗,没有通行短语也无法使用。但每次使用密钥时都需要输入一次这个短语。
  • 不设置通行短语(即生成无密码密钥):这就是我们本文的目标。私钥文件本身无额外密码,拿到即用。这极大方便了自动化脚本、持续集成/持续部署等无需人工干预的场景。

重要安全提示:选择无密码密钥意味着你必须以更高的标准保护你的私钥文件(id_rsaid_ed25519)。绝对不要将它发送给他人或上传到公开的代码仓库。建议将其存放在加密的磁盘或受控的访问目录中。

2.3 Windows OpenSSH 与 Linux OpenSSH 的协作

Windows内置的OpenSSH客户端和Linux上常见的OpenSSH服务器是同一协议的不同实现,它们完全兼容。你从Windows生成的密钥对,可以直接用于任何标准的Linux SSH服务器(如Ubuntu, CentOS, Debian等)。通信的“语言”(协议)和“锁具规格”(密钥格式)都是统一的,这正是其跨平台魅力的所在。

3. Windows端实操:生成你的第一对SSH密钥

现在,让我们打开Windows的“武器库”,开始生成密钥。请确保你使用的是Windows 10 1809以上版本或Windows 11。

3.1 打开终端:以管理员身份还是普通用户?

这里有个关键点:生成用户密钥,不需要管理员权限。我们将在当前登录的用户环境下操作,生成的密钥会保存在该用户的个人目录下(C:\Users\<你的用户名>\.ssh\)。直接按Win + R,输入powershellcmd回车即可。我个人更推荐使用Windows TerminalPowerShell,因为它们功能更强大,显示也更友好。

3.2 使用ssh-keygen生成密钥对

生成密钥的核心命令是ssh-keygen。我们将使用目前最推荐、最安全的算法:Ed25519。它比传统的RSA算法更快、更安全,且生成的密钥更短。

在你的PowerShell或命令提示符中,输入以下命令:

ssh-keygen -t ed25519

按下回车后,你会看到如下交互提示:

Generating public/private ed25519 key pair. Enter file in which to save the key (C:\Users\YourUserName\.ssh\id_ed25519):

第一个提示:保存密钥的文件路径。

  • 直接按回车,接受默认路径C:\Users\YourUserName\.ssh\id_ed25519。这是标准位置,SSH客户端会自动到这里查找私钥。
  • 如果你想为特定服务器或项目使用单独的密钥,可以在这里输入自定义路径和文件名,例如C:\Users\YourUserName\.ssh\github_ed25519

第二个提示(也是实现“无密码”的关键):设置通行短语。

Enter passphrase (empty for no passphrase):

这里直接按回车,不要输入任何字符。这意味着我们不设置通行短语。

第三个提示:确认通行短语。

Enter same passphrase again:

再次直接按回车

如果一切顺利,你将看到类似下面的输出,表明密钥已成功生成:

Your identification has been saved in C:\Users\YourUserName\.ssh\id_ed25519. Your public key has been saved in C:\Users\YourUserName\.ssh\id_ed25519.pub. The key fingerprint is: SHA256:r2Ffz/...(一串独特的指纹) YourUserName@YourPCName The key's randomart image is: +--[ED25519 256]--+ | .o... | | . +o . . | | . o. . . | | .o . . | | . S . . .| | . . . .o| | . . . o.*| | . . o+=B| | . .+*XO| +----[SHA256]-----+

这个“随机艺术图”是密钥指纹的可视化表示,可以用来快速、人工比对密钥,很有趣但非必需。

3.3 密钥文件解读与保管

进入C:\Users\YourUserName\.ssh\目录,你会看到两个新文件(可能需要开启“显示隐藏的项目”):

  • id_ed25519:这是你的私钥。文件没有扩展名。务必妥善保管!它的权限应该非常严格,理想情况下只有你能读写。在Windows上,生成时系统通常会设置好正确的NTFS权限。
  • id_ed25519.pub:这是你的公钥。文件内容是一长串以ssh-ed25519 AAAAC3...开头的文本。这个文件可以安全地分发给任何人。

你可以用记事本打开.pub文件看看它的内容,它通常由三部分组成:密钥类型、Base64编码的密钥本身、以及一个可选的注释(通常是用户名@主机名)。

实操心得:我习惯为不同的用途生成不同的密钥对。比如,一个用于公司所有服务器,一个用于GitHub/GitLab,一个用于个人的VPS。这样即使某一个密钥泄露,影响范围也有限。只需在ssh-keygen时指定不同的文件名即可。

4. Linux端配置:安放你的“公钥锁”

私钥在Windows端准备好了,现在需要把公钥放到Linux服务器上,告诉服务器:“这是我的锁,以后见锁如见人。”

4.1 定位目标账户与授权文件

在Linux上,每个用户都有一个独立的SSH授权文件。你需要登录到目标服务器上你希望免密登录的那个用户账户下。

  1. 首先,用密码方式登录你的Linux服务器。

    ssh your_username@server_ip_address

    输入密码登录。

  2. 进入该用户的SSH配置目录。

    cd ~

    ~符号代表当前用户的家目录,通常是/home/your_username/

  3. 检查或创建.ssh目录和authorized_keys文件。

    mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
    • mkdir -p:如果目录不存在则创建。
    • chmod 700:设置目录权限,仅允许所有者读、写、执行。
    • touch:创建文件(如果不存在)。
    • chmod 600:设置文件权限,仅允许所有者读写。这两个权限(700和600)至关重要,如果设置错误,SSH出于安全考虑会拒绝使用密钥登录。

4.2 将Windows公钥内容追加到授权文件

现在,我们需要把Windows上生成的公钥内容,添加到Linux服务器的~/.ssh/authorized_keys文件末尾。

方法一:手动复制粘贴(最直观)

  1. 在Windows上,用记事本打开你的公钥文件id_ed25519.pub,复制全部内容(是一整行)。
  2. 回到Linux服务器的终端,使用vimnano编辑器打开authorized_keys文件。
    nano ~/.ssh/authorized_keys
  3. 将光标移动到最后一行(如果文件已有内容),粘贴你复制的公钥。确保每个公钥独占一行。
  4. 保存并退出编辑器(在nano中是Ctrl+X,然后按Y确认,再回车)。

方法二:使用ssh-copy-id命令(自动化,但Windows原生不支持)这是一个在Linux/macOS上非常方便的工具,但Windows PowerShell默认没有。不过,我们可以用一条组合命令来模拟它的功能。在Windows PowerShell中执行

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh your_username@server_ip_address "cat >> ~/.ssh/authorized_keys"

这条命令做了两件事:

  • type:读取Windows本地公钥文件内容。
  • 通过管道|传给ssh命令,在远程服务器上执行cat >> ...,将内容追加到authorized_keys文件末尾。

执行后,你仍然需要输入一次用户密码来完成这次操作。这是最后一次输入密码!

方法三:使用Windows 10/11内置OpenSSH的scp(安全复制)如果你觉得方法二的命令有点复杂,可以分两步走:

  1. 将公钥文件复制到服务器临时位置。
    scp $env:USERPROFILE\.ssh\id_ed25519.pub your_username@server_ip_address:/tmp/my_key.pub
    输入密码。
  2. 登录服务器,将其追加到授权文件。
    ssh your_username@server_ip_address # 输入密码登录后执行: cat /tmp/my_key.pub >> ~/.ssh/authorized_keys rm /tmp/my_key.pub # 清理临时文件

4.3 验证权限与配置

在Linux服务器上,最后再确认一下权限:

ls -la ~/.ssh/

你应该看到类似这样的输出:

drwx------ 2 your_username your_username 4096 Oct 10 10:00 . drwxr-xr-x 5 your_username your_username 4096 Oct 10 10:00 .. -rw------- 1 your_username your_username 123 Oct 10 10:00 authorized_keys

重点关注.ssh目录权限是700(drwx------),authorized_keys文件权限是600(-rw-------)。如果不是,请用chmod命令修正。

5. 连接测试与故障排查实录

配置完成后,最激动人心的测试时刻到了。让我们从Windows直接发起连接。

5.1 首次免密连接测试

在Windows PowerShell中,直接运行SSH连接命令:

ssh your_username@server_ip_address

如果一切配置正确,你应该会直接登录到服务器,而不会被要求输入密码。你会看到服务器的命令行提示符。

如果失败了,别担心,这是学习过程的一部分。我们来看最常见的几个问题。

5.2 常见问题与解决方案速查表

我把自己和同事们踩过的坑整理成了下面这个表格,你可以对照症状进行排查:

问题现象可能原因解决方案
连接超时或“Connection refused”1. 服务器IP或端口错误。
2. 服务器SSH服务未运行。
3. 防火墙阻止。
1. 检查IP和端口(默认22)。
2. 在服务器运行sudo systemctl status sshd检查服务状态。
3. 检查服务器防火墙(如sudo ufw status)和云服务商安全组规则。
仍然提示输入密码1. 公钥未正确添加到authorized_keys
2.authorized_keys文件权限过大。
3..ssh目录权限过大。
4. SELinux(某些Linux发行版)限制。
1. 检查公钥内容是否完整、正确复制,确保末尾没有多余空格或换行。
2. 运行chmod 600 ~/.ssh/authorized_keys
3. 运行chmod 700 ~/.ssh
4. 临时禁用SELinux测试:sudo setenforce 0(生产环境慎用,需配置策略)。
“Permission denied (publickey)”1. 服务器未找到公钥。
2. 私钥文件路径或名称不标准,SSH客户端未自动识别。
3. 服务器SSH配置禁止了密钥登录。
1. 确认登录用户名正确,公钥在相应用户的~/.ssh/authorized_keys中。
2. 使用ssh -i /path/to/your/private_key user@host指定私钥。
3. 检查/etc/ssh/sshd_config,确保PubkeyAuthentication yes
“Agent admitted failure to sign”SSH代理(ssh-agent)未运行或未加载私钥。1. 在Windows服务中启动“OpenSSH Authentication Agent”服务。
2. 或使用ssh-add $env:USERPROFILE\.ssh\id_ed25519手动添加密钥到代理。
登录成功但有警告:“Unprotected private key file”Windows上私钥文件的NTFS权限太宽松,被其他用户或系统账户读取。右键点击私钥文件 -> 属性 -> 安全 -> 高级。确保只有你的用户和SYSTEM有完全控制权,移除其他所有用户/组。

5.3 高级调试:使用详细模式

当问题不明确时,在客户端连接时添加-v(详细)甚至-vvv(最详细)参数,可以输出大量调试信息,帮助你定位问题环节。

ssh -v your_username@server_ip_address

观察输出,重点关注以下几行:

  • Offering public key: ...:客户端是否提供了你的公钥?
  • Server accepts key:服务器是否接受了该公钥?
  • Authentication succeeded (publickey):是否认证成功?

在服务器端,你也可以查看SSH日志(通常位于/var/log/auth.log/var/log/secure),但需要sudo权限。

6. 进阶配置与管理技巧

基础打通后,我们可以让这个流程更优雅、更强大。

6.1 使用 SSH 配置文件简化连接

每次输入ssh user@host没问题,但如果你有多个服务器,或者需要指定端口、私钥,每次都打一长串命令很麻烦。可以在Windows用户目录下的.ssh文件夹里创建一个config文件(没有扩展名)。

文件路径:C:\Users\YourUserName\.ssh\config

用记事本编辑,内容如下:

Host myserver # 自定义一个别名 HostName 192.168.1.100 # 服务器真实IP或域名 User your_username # 登录用户名 Port 22 # 端口,默认22可省略 IdentityFile ~/.ssh/id_ed25519 # 指定使用的私钥路径 # 其他参数... Host github.com # 为GitHub配置 User git IdentityFile ~/.ssh/github_key # 可以为GitHub使用独立的密钥

保存后,你就可以直接用别名连接了:

ssh myserver

系统会自动应用config文件中的所有配置。

6.2 管理多个密钥对

正如之前提到的,为不同用途使用不同密钥是很好的实践。生成新密钥对时,只需指定不同的文件名:

ssh-keygen -t ed25519 -f ~/.ssh/github_ed25519

-f参数指定生成的文件名前缀。然后,在对应的服务(如GitHub)或服务器的authorized_keys文件中添加对应的公钥即可。在连接时,通过-i参数或上述config文件中的IdentityFile指令来指定使用哪个私钥。

6.3 关于 ssh-agent 的取舍

ssh-agent是一个在后台运行的程序,用于管理你的私钥。你可以将私钥添加到代理中,并设置一个通行短语。之后,在一段时间内或整个会话期间,你只需要输入一次通行短语,ssh-agent会帮你处理后续的所有签名请求。

对于无密码密钥ssh-agent的作用相对减弱,因为私钥本身没有密码保护。但启动ssh-agent并添加密钥仍然有一个好处:它能为某些图形化工具或脚本提供统一的密钥管理接口。

在Windows上,你可以通过服务管理器启动“OpenSSH Authentication Agent”服务,并设置为自动启动。然后在PowerShell中运行ssh-add来添加你的默认私钥(~\.ssh\id_ed25519)。对于无密码密钥,添加过程不需要输入任何东西。

6.4 服务器端安全加固建议

在服务器上启用密钥登录后,为了极致安全,可以考虑禁用密码登录。但请务必确保你的密钥登录已经100%工作正常,并且你有多条备用登录途径(如控制台VNC),否则一旦密钥出问题,你将无法登录服务器!

编辑服务器SSH配置文件:

sudo nano /etc/ssh/sshd_config

找到并修改以下行:

PasswordAuthentication no PubkeyAuthentication yes

然后重启SSH服务:

sudo systemctl restart sshd

这样,任何尝试用密码登录的行为都会被直接拒绝,只有持有有效私钥的用户才能进入,极大地抵御了暴力破解攻击。

7. 无缝集成:在VS Code、FileZilla等工具中使用密钥

配置好命令行SSH后,很多图形化工具也能受益。

Visual Studio Code Remote - SSH

  1. 安装“Remote - SSH”扩展。
  2. 点击左下角绿色图标,选择“Connect to Host...”。
  3. 输入ssh your_username@server_ip_address
  4. VS Code会自动读取你本地的SSH配置(包括config文件和私钥),完成连接。无需额外配置。

FileZilla (SFTP)

  1. 打开站点管理器,新建站点。
  2. 协议选择“SFTP”。
  3. 输入主机、用户名。
  4. 在“登录类型”处,选择“密钥文件”。
  5. 点击“浏览”,选择你的私钥文件(例如id_ed25519,注意不是.pub文件)。
  6. 连接即可。

Git Bash / WSL: 如果你在Windows上使用Git Bash或Windows Subsystem for Linux (WSL),它们通常能直接访问或继承Windows的SSH配置。你可以将密钥文件放在WSL的用户目录~/.ssh/下,或者通过ssh-agent转发来使用Windows管理的密钥。

走到这一步,你已经成功地在Windows和Linux之间架起了一座安全、便捷的密钥桥梁。从今往后,与服务器的每一次邂逅都将是一次无声而高效的握手,再也不用被密码打断思路。这套流程不仅是效率工具,更是现代IT基础设施安全访问的基石。当你需要编写自动化脚本、配置CI/CD流水线时,这套无密码的密钥认证机制将成为不可或缺的一环。

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

若依WMS仓库管理系统:企业级仓储管理的完整解决方案

若依WMS仓库管理系统&#xff1a;企业级仓储管理的完整解决方案 【免费下载链接】RuoYi-WMS-VUE 若依wms是一套基于若依的wms仓库管理系统&#xff0c;支持lodop和网页打印入库单、出库单。包括仓库/库区/货架管理&#xff0c;出入库管理&#xff0c;客户/供应商/承运商&#x…

作者头像 李华
网站建设 2026/7/4 13:48:34

基于YOLOv12的晶圆缺陷检测系统开发实践

1. 项目概述 在半导体制造领域&#xff0c;晶圆表面的微小缺陷直接影响着芯片的良率和性能。传统的人工检测方法不仅效率低下&#xff0c;而且容易受到主观判断的影响。作为一名长期从事工业视觉检测的工程师&#xff0c;我最近基于YOLOv12开发了一套完整的晶圆缺陷检测系统&am…

作者头像 李华
网站建设 2026/7/4 13:47:47

3步实现永久微信聊天备份:本地化智能分析完整指南

3步实现永久微信聊天备份&#xff1a;本地化智能分析完整指南 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg…

作者头像 李华
网站建设 2026/7/4 13:46:00

损失函数选择不是填空题:工业级AI建模的四维决策法

1. 项目概述&#xff1a;这不是一场“对错”之争&#xff0c;而是一次建模思维的现场解剖“How To Choose Your Loss Function — Where I Disagree With Cassie Kozyrkov”这个标题一出来&#xff0c;我就在笔记本上划了三道横线。不是因为火药味&#xff0c;而是因为它精准戳…

作者头像 李华
网站建设 2026/7/4 13:45:03

免费LLM API安全实战:从威胁建模到纵深防御的完整指南

1. 项目概述&#xff1a;为什么免费LLM API的安全问题如此突出&#xff1f; 最近在几个开发者社群里&#xff0c;看到不少朋友在讨论如何免费调用各种大模型的API来搭建自己的应用&#xff0c;从智能客服到内容生成&#xff0c;玩法很多。但聊着聊着&#xff0c;话题总会拐到一…

作者头像 李华
网站建设 2026/7/4 13:42:36

AI技术提升SEO关键词策略的实用技巧

在当今数字营销的背景下&#xff0c;AI技术正迅速改变SEO核心词策略的玩法。依靠利用AI工具、企业能够更精准地进行核心词选择排名。这除了提高了企业内容的可见性、还帮助吸引更多目标受众。文章将介绍运用AI技术优化核心词布局的重要性、并分享实用技巧等成功案例&#xff0c…

作者头像 李华