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

发布时间:2026/7/4 13:50:07

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时会发生以下“对话”客户端说“你好我是用户alice我想用密钥登录。”服务器找到用户alice家目录下的“锁”公钥生成一段随机挑战信息并用这把“锁”加密然后发给客户端。客户端收到加密的挑战信息后使用自己持有的唯一“钥匙”私钥进行解密。客户端将解密后的原始挑战信息进行某种处理如与会话ID混合哈希再用私钥签名将结果发回服务器。服务器用存储的“锁”公钥验证这个签名。如果验证通过就证明客户端确实拥有对应的私钥身份认证成功。这个过程完全不需要在网络上传输私钥也无需输入密码除非你为私钥设置了额外的通行短语。安全性远高于每次都在网络上传输可被截获的密码。2.2 无密码密钥 vs. 带通行短语的密钥在生成密钥时系统会询问你是否设置一个“通行短语”。这里有两个选择设置通行短语为私钥再加一层密码保护。即使私钥文件被盗没有通行短语也无法使用。但每次使用密钥时都需要输入一次这个短语。不设置通行短语即生成无密码密钥这就是我们本文的目标。私钥文件本身无额外密码拿到即用。这极大方便了自动化脚本、持续集成/持续部署等无需人工干预的场景。重要安全提示选择无密码密钥意味着你必须以更高的标准保护你的私钥文件id_rsa或id_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输入powershell或cmd回车即可。我个人更推荐使用Windows Terminal或PowerShell因为它们功能更强大显示也更友好。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/...一串独特的指纹 YourUserNameYourPCName The keys randomart image is: --[ED25519 256]-- | .o... | | . o . . | | . o. . . | | .o . . | | . S . . .| | . . . .o| | . . . o.*| | . . oB| | . .*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授权文件。你需要登录到目标服务器上你希望免密登录的那个用户账户下。首先用密码方式登录你的Linux服务器。ssh your_usernameserver_ip_address输入密码登录。进入该用户的SSH配置目录。cd ~~符号代表当前用户的家目录通常是/home/your_username/。检查或创建.ssh目录和authorized_keys文件。mkdir -p ~/.ssh chmod 700 ~/.ssh touch ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keysmkdir -p如果目录不存在则创建。chmod 700设置目录权限仅允许所有者读、写、执行。touch创建文件如果不存在。chmod 600设置文件权限仅允许所有者读写。这两个权限700和600至关重要如果设置错误SSH出于安全考虑会拒绝使用密钥登录。4.2 将Windows公钥内容追加到授权文件现在我们需要把Windows上生成的公钥内容添加到Linux服务器的~/.ssh/authorized_keys文件末尾。方法一手动复制粘贴最直观在Windows上用记事本打开你的公钥文件id_ed25519.pub复制全部内容是一整行。回到Linux服务器的终端使用vim或nano编辑器打开authorized_keys文件。nano ~/.ssh/authorized_keys将光标移动到最后一行如果文件已有内容粘贴你复制的公钥。确保每个公钥独占一行。保存并退出编辑器在nano中是CtrlX然后按Y确认再回车。方法二使用ssh-copy-id命令自动化但Windows原生不支持这是一个在Linux/macOS上非常方便的工具但Windows PowerShell默认没有。不过我们可以用一条组合命令来模拟它的功能。在Windows PowerShell中执行type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh your_usernameserver_ip_address cat ~/.ssh/authorized_keys这条命令做了两件事type读取Windows本地公钥文件内容。通过管道|传给ssh命令在远程服务器上执行cat ...将内容追加到authorized_keys文件末尾。执行后你仍然需要输入一次用户密码来完成这次操作。这是最后一次输入密码方法三使用Windows 10/11内置OpenSSH的scp安全复制如果你觉得方法二的命令有点复杂可以分两步走将公钥文件复制到服务器临时位置。scp $env:USERPROFILE\.ssh\id_ed25519.pub your_usernameserver_ip_address:/tmp/my_key.pub输入密码。登录服务器将其追加到授权文件。ssh your_usernameserver_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_usernameserver_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 userhost指定私钥。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_usernameserver_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 userhost没问题但如果你有多个服务器或者需要指定端口、私钥每次都打一长串命令很麻烦。可以在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安装“Remote - SSH”扩展。点击左下角绿色图标选择“Connect to Host...”。输入ssh your_usernameserver_ip_address。VS Code会自动读取你本地的SSH配置包括config文件和私钥完成连接。无需额外配置。FileZilla (SFTP)打开站点管理器新建站点。协议选择“SFTP”。输入主机、用户名。在“登录类型”处选择“密钥文件”。点击“浏览”选择你的私钥文件例如id_ed25519注意不是.pub文件。连接即可。Git Bash / WSL 如果你在Windows上使用Git Bash或Windows Subsystem for Linux (WSL)它们通常能直接访问或继承Windows的SSH配置。你可以将密钥文件放在WSL的用户目录~/.ssh/下或者通过ssh-agent转发来使用Windows管理的密钥。走到这一步你已经成功地在Windows和Linux之间架起了一座安全、便捷的密钥桥梁。从今往后与服务器的每一次邂逅都将是一次无声而高效的握手再也不用被密码打断思路。这套流程不仅是效率工具更是现代IT基础设施安全访问的基石。当你需要编写自动化脚本、配置CI/CD流水线时这套无密码的密钥认证机制将成为不可或缺的一环。

相关新闻