Windows SSH密钥生成与配置全攻略:从原理到实战部署
发布时间:2026/8/14 10:45:45 作者:尧图编辑部 阅读量:1,286

1. 项目缘起为什么在Windows上生成SSH密钥是远程运维的“第一课”如果你是一名需要在Windows电脑上管理Linux服务器的开发者、运维工程师或者只是偶尔需要连上云服务器传个文件那么“SSH密钥登录”这个技能点你迟早得点亮。我见过太多新手包括几年前的我自己还在傻傻地用密码登录服务器。每次连接都要输入一长串密码不仅麻烦而且从安全角度看这就像把自家大门的钥匙挂在门把手上——密码在网络上传输总有被截获的风险。更别提那些设置了复杂密码每次都要翻密码本或者因为输错几次就被服务器防火墙暂时封禁IP的尴尬了。所以用SSH密钥对公钥和私钥来替代密码几乎是所有专业场景下的标准操作。它的原理很简单你在本地比如你的Windows电脑生成一对数学上关联的“钥匙”。你把其中一把“公钥”放到你要连接的Linux服务器上自己保管好另一把“私钥”。下次连接时你的SSH客户端会用私钥和服务器上的公钥进行一场复杂的数学“对话”如果匹配成功就放行全程无需输入密码。这种方式既安全私钥不出本地又便捷一次配置永久免密。网上教程很多但很多要么过于简略跳过了关键细节要么假设你已经有Linux基础对Windows用户不够友好。今天我就以一个在Windows和Linux之间反复横跳多年的老运维视角带你从头到尾、掰开揉碎地走一遍整个流程。我们不止要“生成”密钥更要理解每一步背后的“为什么”以及那些教程里不会写的“坑”和“技巧”。2. 环境准备选对你的“武器库”在Windows上操作SSH你首先得有一个趁手的SSH客户端。这不是废话因为选择不同后续的步骤和体验会有细微但重要的差别。2.1 SSH客户端的“三国演义”目前主流的有三大阵营你需要根据你的使用习惯和场景来选择1. 原生OpenSSH客户端Windows 10/11 内置这是微软从Windows 10 1809版本开始逐步集成到系统里的功能。你可以通过“设置”-“应用”-“可选功能”来查看和安装“OpenSSH 客户端”。安装后你就可以在PowerShell或者CMD里直接使用ssh、ssh-keygen等命令了。优点原生集成无需额外安装与系统结合度好适合喜欢命令行纯粹体验的用户。缺点功能相对基础对于密钥管理、多配置文件的直观编辑不如图形化工具方便。早期的版本可能存在一些兼容性问题但现在已比较稳定。检查是否安装打开PowerShell输入ssh -V如果显示类似OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2的版本信息说明已安装。2. Git for Windows 附带的SSH工具如果你在Windows上做开发几乎一定会安装Git。Git for Windows自带了一个MinGWMinimalist GNU for Windows环境里面包含了一套完整的SSH工具ssh,ssh-keygen,ssh-agent等。优点对于开发者来说是“开箱即用”无需单独配置。其行为更接近Linux环境与Git工作流无缝集成。缺点如果你不开发单独为这个装Git有点“杀鸡用牛刀”。并且需要注意环境变量有时会和系统自带的OpenSSH冲突。路径通常安装在C:\Program Files\Git\usr\bin\下。3. 第三方图形化SSH客户端如PuTTY、Bitvise SSH Client这是很多从老Windows时代过来的运维工程师的“初恋”。尤其是PuTTY极其轻量配套的puttygen.exe密钥生成器和pageant.exe密钥代理也很有名。优点图形界面对新手友好。PuTTY的会话管理功能非常方便可以保存多个服务器连接信息。Bitvise功能更强大集成了SFTP图形化文件传输。缺点生成的密钥格式PPK是私有的与OpenSSH的格式不直接兼容需要转换。对于追求自动化脚本和统一工作流的用户来说多了一层转换步骤。我的选择与建议对于现代Windows用户Win10/11我强烈推荐使用系统自带的OpenSSH客户端。原因有三第一它是未来趋势微软在持续维护第二它保证了与Linux/Unix世界SSH工具链的100%兼容性生成的密钥格式是标准的OpenSSH格式id_rsa,id_rsa.pub无需转换第三在PowerShell下操作可以很方便地编写脚本实现自动化。本文后续的演示也将基于此进行。如果你已经习惯了PuTTY我也会在关键步骤提及其差异和转换方法。2.2 确认你的远程Linux主机信息在开始生成密钥之前你需要明确你要连接的目标。准备好以下信息服务器IP地址例如192.168.1.100或一个域名example.com。SSH端口号默认是22。但出于安全考虑很多服务器会修改默认端口例如2222。如果你不知道需要联系服务器管理员或查看服务配置。登录用户名你计划用来登录的Linux账户名通常是root拥有最高权限或者一个普通用户如ubuntu,ec2-user常见于云服务器等。有了这些我们的“弹药”就准备齐全了。3. 核心操作在Windows PowerShell中生成SSH密钥对这是整个流程的核心步骤。我们将使用OpenSSH的ssh-keygen工具。3.1 打开终端并理解密钥生成命令首先以管理员身份或普通用户身份打开Windows PowerShell。在开始菜单搜索“PowerShell”即可。生成密钥的基本命令是ssh-keygen -t rsa -b 4096 -C your_emailexample.com让我们拆解这个命令理解每个参数的意义这是避免盲目操作的关键ssh-keygen密钥生成工具。-t rsa指定密钥的算法类型。rsa是历史悠久、兼容性最好的算法。其他可选的有ed25519更安全、更快但一些老系统不支持。对于绝大多数场景rsa是稳妥的选择。-b 4096指定密钥的位数长度。位数越长安全性越高但生成和验证稍慢。早期默认是2048位但现在4096位已成为新的安全实践标准。我强烈建议直接使用4096位一步到位。-C your_emailexample.com为密钥添加一个注释。这个注释会保存在公钥文件的末尾用于标识这个密钥的“主人”。通常建议填写你的邮箱或者一个能让你自己一眼认出这个密钥用途的描述比如-C my_laptop_for_work_2024。这个注释不是密钥的一部分不影响验证只起标识作用。3.2 交互式生成过程详解与避坑在PowerShell中输入上述命令替换你的邮箱并回车后你会进入一个交互式流程第一步指定密钥文件保存路径Enter file in which to save the key (C:\Users\YourUserName/.ssh/id_rsa):这里询问你把生成的私钥和公钥对保存在哪里。括号里的是默认路径。对于Windows上的OpenSSH它通常位于你的用户目录下的.ssh文件夹中例如C:\Users\张三\.ssh\。直接按回车接受默认路径和默认文件名id_rsa和id_rsa.pub。这是最推荐的做法因为大多数SSH客户端都会默认去这个位置寻找名为id_rsa的私钥。如果你想指定其他路径或文件名可以输入完整路径例如C:\mykeys\server_key。但这样做之后每次连接时你可能都需要通过-i参数ssh -i C:\mykeys\server_key userhost来指定私钥比较麻烦。重要提示.ssh目录如果不存在ssh-keygen会自动创建。确保这个目录的权限是安全的只有你自己可读在Windows上通常用户目录的权限是自动设置好的。第二步设置密钥的通行短语PassphraseEnter passphrase (empty for no passphrase): Enter same passphrase again:这是整个过程中最容易让人纠结也最体现安全素养的一步。它问你是否要为私钥设置一个“通行短语”不设置直接按两次回车私钥将没有任何密码保护。任何人只要拿到了你的私钥文件就能冒充你访问所有配置了对应公钥的服务器。极其危险除非你的私钥存储在绝对物理安全、永不联网的设备上这种情况极少。设置一个强通行短语这是强烈推荐的做法。它会为私钥文件本身再增加一层加密。即使私钥文件不慎泄露比如电脑被盗、误传到网盘没有通行短语也无法使用它。每次使用该密钥进行连接时或每次开机后第一次使用系统会提示你输入这个通行短语。关于通行短语的实操心得它是什么你可以把它想象成私钥的“保险柜密码”。私钥文件本身被这个密码加密存储着。输入麻烦吗确实每次连接都要输密码会降低便利性。但我们可以用ssh-agentSSH代理来解决。ssh-agent是一个在后台运行的服务你只需要在开机后或第一次使用密钥时将私钥“添加”到代理中并输入一次通行短语。之后的所有SSH连接代理都会自动提供私钥无需重复输入。后面我们会详细讲如何配置。怎么设置使用一个足够长、包含大小写字母、数字和特殊字符的短语例如MyDog‘sNameIs2024!。不要用简单密码。第三步生成成功设置完通行短语后你会看到类似下面的输出Your identification has been saved in C:\Users\YourUserName/.ssh/id_rsa. Your public key has been saved in C:\Users\YourUserName/.ssh/id_rsa.pub. The key fingerprint is: SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_emailexample.com The key‘s randomart image is: ---[RSA 4096]---- | .oo | | o o.o. | | . . .o . | | . . o . | | S . . . | | . . . . | | . * . . | | . B . . | | E* .o | ----[SHA256]-----这表示密钥对已经成功生成。id_rsa是私钥必须像保护银行卡密码一样保护它绝不能泄露。id_rsa.pub是公钥它的内容就是我们要上传到服务器上的东西可以公开。4. 密钥部署将公钥“安装”到Linux服务器生成了钥匙下一步就是把“公钥”这把锁芯安装到远程服务器的门你的账户上。4.1 手动复制公钥内容首先我们需要获取公钥的字符串。在PowerShell中可以使用cat命令或者type在PowerShell中两者通常都可用来查看公钥文件内容cat ~/.ssh/id_rsa.pub输出是一行很长的字符串以ssh-rsa AAAAB3NzaC1yc2E...开头以你之前设置的注释邮箱结尾。完整地选中并复制这一整行内容。注意不要多复制空格或换行符。4.2 上传公钥到服务器的标准方法我们需要将复制的公钥内容追加写入到Linux服务器上对应用户家目录下的~/.ssh/authorized_keys文件中。这个文件存储了所有被允许用密钥登录此账户的公钥。方法一使用ssh-copy-id工具最推荐ssh-copy-id是一个自动化脚本能帮你完成复制和权限设置。Windows OpenSSH 也包含这个工具。ssh-copy-id -p 22 usernameserver_ip例如ssh-copy-id -p 2222 root192.168.1.100执行后它会提示你输入一次该用户当前的密码。输入正确后它会自动将你的公钥写入远程服务器的~/.ssh/authorized_keys文件并自动设置好.ssh目录和authorized_keys文件的正确权限这一点非常重要。这是最安全、最便捷的方式。方法二手动追加当ssh-copy-id不可用时如果服务器没有ssh-copy-id命令或者端口非标准可以分步操作使用密码登录服务器ssh -p 2222 usernameserver_ip确保.ssh目录存在并权限正确mkdir -p ~/.ssh chmod 700 ~/.ssh将公钥内容写入authorized_keysecho 你刚才复制的整行公钥内容 ~/.ssh/authorized_keys注意这里的是追加如果用会覆盖原有内容如果之前有其他密钥会导致它们失效。设置authorized_keys文件权限chmod 600 ~/.ssh/authorized_keys退出登录exit为什么权限设置如此重要这是新手最容易踩的坑如果.ssh目录权限不是700drwx------或者authorized_keys文件权限不是600-rw-------SSH守护进程sshd出于安全考虑会直接拒绝使用密钥登录你可能会看到“Permission denied (publickey)”的错误。ssh-copy-id帮我们自动处理了这一切这也是推荐它的主要原因。5. 连接测试与排错验证你的劳动成果公钥部署完成后最关键的一步就是测试。5.1 首次连接测试在Windows PowerShell中尝试使用密钥登录ssh -p 2222 usernameserver_ip如果一切配置正确如果你没有设置通行短语或者已经将私钥添加到了ssh-agent且代理正在运行你应该能直接登录成功不再提示输入用户密码。如果你设置了通行短语且没有启动ssh-agent此时会提示你输入私钥的通行短语Enter passphrase for key ‘C:\Users\...\.ssh\id_rsa‘:。输入正确的通行短语后即可登录。看到命令行提示符变成远程服务器的样子例如[usernamehostname ~]$恭喜你密钥登录配置成功了5.2 常见问题与深度排错指南如果连接失败别慌。SSH的报错信息通常比较明确我们可以按照以下链路层层排查问题1Permission denied (publickey).这是最常见的错误意思是服务器认为你提供的公钥认证失败了。排查点1公钥是否正确上传重新登录服务器用密码检查~/.ssh/authorized_keys文件内容cat ~/.ssh/authorized_keys确认你的公钥完整地存在于文件中没有多余的空格或换行。可以手动再粘贴一次确保无误。排查点2文件权限是否正确重中之重在服务器上执行ls -la ~/.ssh/确保显示结果类似drwx------ 2 username username 4096 Apr 10 10:00 . drwxr-xr-x 5 username username 4096 Apr 10 09:58 .. -rw------- 1 username username 742 Apr 10 10:00 authorized_keys如果权限不对用chmod命令修正chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys排查点3服务器SSH配置是否允许密钥登录检查服务器/etc/ssh/sshd_config文件需要root权限sudo cat /etc/ssh/sshd_config | grep -i pubkey确保有一行是PubkeyAuthentication yes。如果不是需要修改并重启sshd服务sudo systemctl restart sshd。注意修改前请备份且确保你有其他方式能登录服务器否则配置错误可能导致无法连接。排查点4是否指定了正确的私钥如果你生成的私钥不是默认的id_rsa或者放在了其他路径需要在连接时用-i参数指定ssh -i C:\path\to\your\private_key -p 2222 usernameserver_ip问题2Enter passphrase for key ... 提示一直出现即使输入正确。这通常意味着ssh-agent没有运行或者私钥没有添加到代理中。每次连接都需要手动输入通行短语。解决方案就是配置ssh-agent。问题3连接超时或网络错误。这通常与密钥无关是网络或防火墙问题。检查服务器IP和端口号是否正确。服务器的防火墙是否放行了SSH端口如2222。本地网络是否正常。6. 进阶配置提升安全与效率的必备技巧基础功能通了我们来点提升体验和安全性的“骚操作”。6.1 配置SSH客户端配置文件 (~/.ssh/config)每次连接都要输入ssh -p 2222 usernameserver_ip很麻烦。我们可以在Windows用户目录的.ssh文件夹下创建一个config文件没有后缀名来为不同的主机设置别名和默认参数。用记事本或VS Code打开或创建C:\Users\YourUserName\.ssh\config添加如下内容Host myserver # 给你服务器起一个简短的别名 HostName 192.168.1.100 # 服务器的真实IP或域名 Port 2222 # SSH端口 User root # 登录用户名 IdentityFile ~/.ssh/id_rsa # 指定使用的私钥路径如果非默认 # 其他可选参数 # ServerAliveInterval 60 # 每60秒发送一个保活包防止连接被中断 # TCPKeepAlive yes # 保持TCP连接保存后以后连接这台服务器只需要输入ssh myserverSSH会自动应用config文件中Host myserver段落下的所有配置极大简化了命令。6.2 启用和管理 ssh-agent通行短语管家如前所述ssh-agent可以帮你管理通行短语实现一次输入多次使用。在Windows上启动并配置ssh-agent以管理员身份打开PowerShell将ssh-agent服务设置为自动启动Get-Service ssh-agent | Set-Service -StartupType Automatic立即启动ssh-agent服务Start-Service ssh-agent将你的私钥添加到ssh-agentssh-add ~/.ssh/id_rsa执行这条命令后会提示你输入一次私钥的通行短语。输入正确后该私钥就被加载到代理中了。现在你本次开机期间的所有SSH连接都不再需要输入通行短语。查看已添加的密钥ssh-add -l移除某个密钥ssh-add -d ~/.ssh/id_rsa一个实用技巧让PowerShell Profile自动添加密钥如果你觉得每次开机都要手动ssh-add还是麻烦可以把这个命令加到PowerShell的启动脚本里。首先检查你的Profile文件是否存在if (!(Test-Path -Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }然后用记事本打开它notepad $PROFILE在文件末尾添加一行ssh-add ~/.ssh/id_rsa 2$null2$null是为了忽略已经添加过密钥时产生的警告信息。这样每次打开PowerShell它都会尝试添加你的默认私钥你只需要在第一次打开时输入通行短语即可。6.3 安全加固禁用密码登录最终步骤当密钥登录测试完全稳定后为了彻底杜绝暴力破解密码的风险你应该在服务器上禁用密码登录。警告此操作有风险必须确保你的密钥登录100%可用并且你已经将公钥添加到了所有需要登录的账户特别是root和你的日常账户的authorized_keys中。最好保留一个已开启密钥登录的root或sudo用户会话窗口以便在配置出错时能补救。在Linux服务器上编辑SSH服务配置文件sudo vim /etc/ssh/sshd_config找到以下两行并修改为PasswordAuthentication no PubkeyAuthentication yes保存退出后重启SSH服务使配置生效sudo systemctl restart sshd务必不要立即关闭当前的连接窗口新开一个终端窗口用密钥尝试连接服务器。确认能成功登录后再关闭旧的窗口。从此你的服务器就只能通过SSH密钥这把“物理钥匙”来访问了安全性大大提升。7. 关于PuTTY用户的特别指南如果你因为历史原因或特定需求必须使用PuTTY流程上有些许不同核心在于密钥格式的转换。使用 PuTTYgen 生成密钥运行puttygen.exe点击“Generate”生成密钥晃动鼠标增加随机性。生成后设置“Key passphrase”相当于通行短语。然后你需要分别保存Save private key保存为.ppk格式的私钥文件PuTTY专用格式。将公钥框中以ssh-rsa AAA...开头的内容全选复制这就是OpenSSH格式的公钥用于上传到服务器的authorized_keys文件。这一步和之前一样。使用 Pageant 管理密钥pageant.exe是PuTTY的密钥代理。运行它它会驻留在系统托盘。右键点击其图标选择“Add Key”加载你保存的.ppk文件并输入通行短语。之后PuTTY连接时就会自动使用这个已加载的密钥。格式转换如果你已经有了OpenSSH格式的私钥id_rsa想在PuTTY里用需要用PuTTYgen的“Load”功能加载这个私钥然后另存为.ppk格式。反之如果你有.ppk私钥想给OpenSSH用在PuTTYgen中加载.ppk后在菜单“Conversions” - “Export OpenSSH key”可以导出OpenSSH格式的私钥。我个人建议除非有强制要求尽量迁移到OpenSSH标准工具链这样可以减少不必要的转换步骤脚本化、自动化也更方便。走到这里你已经完成了从Windows到Linux的SSH密钥登录全链路配置。这套方法不仅适用于单台服务器当你管理成百上千台服务器时合理的~/.ssh/config文件管理和统一的密钥策略将是提升你运维效率的利器。记住安全无小事给私钥加上强通行短语并善用ssh-agent才能在便捷和安全之间找到最佳平衡点。