FEATURED · 精选文章

SSH免密登录原理与实战:从密钥对到服务器集群自动化管理

发布时间 / 2026/8/18 7:05:34
来源 / 创域科博编辑部
栏目 / 资讯中心
SSH免密登录原理与实战:从密钥对到服务器集群自动化管理 1. 为什么我们需要免密登录想象一下这个场景你管理着三台服务器一台是Web应用服务器一台是数据库服务器还有一台是日志分析服务器。每天你都需要从本地机器登录到Web服务器再从Web服务器跳转到数据库服务器去检查状态最后还要从数据库服务器把日志文件拉到分析服务器上。如果每次跳转都要输入一次密码一天下来光是敲密码和等待连接的时间就够你喝好几杯咖啡了。更别提在自动化脚本里比如用Ansible批量部署、用Crontab定时备份、用Git通过SSH协议拉取代码时密码输入是完全不可行的。这就是SSH免密登录或称密钥对认证要解决的核心痛点实现安全、高效、自动化的服务器间访问。它用非对称加密的密钥对替代了传统的密码认证。你生成一对密钥一个私钥Private Key绝对保密存放在发起连接的客户端一个公钥Public Key可以公开存放在目标服务器的授权列表里。当客户端尝试连接时服务器会用存储的公钥来挑战客户端客户端用私钥完成挑战证明自己的身份。整个过程无需人工干预既安全又便捷。从你提供的热搜词也能看出这几乎是所有服务器运维和开发者的刚需。无论是vscode连接ssh远程服务器进行远程开发还是gitlab配置ssh密钥管理代码或是构建服务器集群进行自动化管理免密登录都是基石。很多人卡在第一步比如不清楚公钥和私钥到底放哪里或者像cursor 配置ssh免密登录、vscode ssh这些现代编辑器/IDE的集成配置其底层原理依然是标准的SSH密钥认证。搞懂它一通百通。2. 密钥对理解免密登录的“锁与钥匙”在动手之前我们必须把核心概念——非对称加密——用最直白的方式讲清楚。这能帮你避开后面90%的配置困惑。你可以把公钥想象成一把特殊的“锁”。这把锁有一个特性它只能从外面锁上但开锁的钥匙不是通用的。你可以把这把“锁”公钥复制很多份挂在任何你想保护的门上比如你的GitHub账户、你的云服务器。任何人都可以看到这把锁。而私钥就是唯一能打开那把锁的“钥匙”。这把钥匙你必须严格保管在自己手里绝不能给别人。当你需要访问那扇门时你用你的私钥去开锁。门上的锁公钥会验证你的钥匙私钥是否匹配。匹配门就开了。这个过程在SSH中是这样的生成你在客户端比如你的笔记本电脑或者服务器A使用ssh-keygen命令生成一对密钥。默认会生成两个文件id_rsa私钥和id_rsa.pub公钥。id_rsa文件没有后缀内容以-----BEGIN OPENSSH PRIVATE KEY-----开头这就是你的命根子。分发你把公钥id_rsa.pub的内容追加到目标服务器比如服务器B上一个特定用户的~/.ssh/authorized_keys文件里。这个文件里可以存放很多把不同的“锁”多个公钥来自不同的客户端。认证当你从客户端SSH连接服务器B时服务器会说“我这里有你的锁公钥请证明你有对应的钥匙。” 客户端会自动使用本地的私钥进行计算并回应。验证通过直接登录。这里有几个关键点也是热搜里常见问题的答案私钥在哪默认在你执行ssh-keygen命令的当前用户家目录下的.ssh/文件夹里。例如在Linux/macOS上是/home/yourname/.ssh/id_rsa在Windows上如果使用Git Bash或WSL是C:\Users\yourname\.ssh\id_rsa。像创建 secret 保存私钥这类需求通常是在Kubernetes等容器平台中将私钥作为加密的Secret对象来管理供Pod内的应用使用而不是给人用的。公钥格式就是一个文本文件内容形如ssh-rsa AAAAB3NzaC1yc2E... userhost。你复制粘贴的就是整个这一行。authorized_keys文件这是服务端的“钥匙串”。每行一个公钥。它的权限必须非常严格通常应该是600仅所有者可读写其所在的.ssh目录权限应为700。权限不对是导致免密登录失败的常见原因。理解了“锁与钥匙”模型我们再去看rsa 公钥 私钥 加签验签、gitee代码如何通过公钥拉到本地这些问题本质都是一样的服务端用公钥验证客户端用私钥产生的签名。3. 实战一步步配置两台服务器间的免密登录现在我们以最常见的场景为例从服务器A客户端免密登录到服务器B服务端。假设两台服务器都是Linux系统用户名都是ubuntu。3.1 在客户端服务器A生成密钥对首先登录到服务器A。打开终端执行密钥生成命令ssh-keygen -t rsa -b 4096 -C serverA_to_serverB-t rsa指定密钥类型为RSA。虽然现在ed25519更流行更快更安全但RSA兼容性最广。如果你确定环境都支持可以用-t ed25519。-b 4096指定密钥长度为4096位安全性更高。默认是2048位。-C serverA_to_serverB添加一个注释通常用邮箱或标识。这里我们用来标记这对密钥的用途非常清晰。这个注释会出现在公钥的末尾方便你日后管理多对密钥。交互过程Generating public/private rsa key pair. Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa):提示你密钥保存的位置。直接按回车使用默认路径/home/ubuntu/.ssh/id_rsa。如果你已经存在id_rsa文件这里可以输入一个新路径比如/home/ubuntu/.ssh/id_rsa_serverB以避免覆盖。Enter passphrase (empty for no passphrase):询问你是否为私钥设置一个“密码短语”passphrase。这里是个重要选择直接回车空私钥没有密码。最方便自动化脚本无忧。但一旦私钥文件泄露别人就能直接使用。输入一个密码为私钥再加一层保护。即使私钥文件被盗没有密码也无法使用。但每次使用该密钥包括自动化脚本时都需要输入这个密码对于全自动化场景不太友好。对于服务器间的跳转我通常建议不设密码但务必保证私钥文件本身权限为600和服务器A的安全。再次回车确认后密钥对就生成好了。你会看到类似输出并生成两个文件~/.ssh/id_rsa私钥文件权限自动为600。~/.ssh/id_rsa.pub公钥文件权限自动为644。3.2 将公钥部署到服务端服务器B接下来我们需要把服务器A的公钥“挂”到服务器B的“门”上。方法一使用ssh-copy-id命令最推荐最安全在服务器A上执行ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu服务器B的IP地址例如ssh-copy-id -i ~/.ssh/id_rsa.pub ubuntu192.168.1.100-i指定要发送的公钥文件路径。命令会提示你输入服务器B上ubuntu用户的密码。输入正确后它会自动完成以下所有工作登录服务器B。检查并创建~/.ssh目录如果不存在。将公钥内容追加到~/.ssh/authorized_keys文件末尾。自动将authorized_keys文件的权限设置为600将.ssh目录权限设置为700。 这是最无脑、最不容易出错的方式。方法二手动复制理解原理如果服务器没有ssh-copy-id命令比如某些精简版系统或者你想更清晰地了解过程可以手动操作。在服务器A上查看并复制公钥内容cat ~/.ssh/id_rsa.pub选中终端输出的全部内容一整行复制下来。登录到服务器Bssh ubuntu服务器B的IP地址 # 输入密码登录在服务器B上操作# 1. 确保.ssh目录存在并设置正确权限 mkdir -p ~/.ssh chmod 700 ~/.ssh # 2. 将复制的公钥追加到authorized_keys文件 echo 你刚才复制的公钥内容 ~/.ssh/authorized_keys # 3. 关键一步设置authorized_keys文件的权限 chmod 600 ~/.ssh/authorized_keys务必注意是追加如果用则会覆盖文件导致其他已有的公钥失效。权限600和700是SSH协议的强制安全要求权限过宽如644或755会导致SSH服务器出于安全考虑直接拒绝密钥认证这是ubuntu ssh一直被拒绝的常见原因之一。3.3 测试与验证完成部署后回到服务器A尝试免密登录ssh ubuntu服务器B的IP地址如果一切顺利你应该会直接登录到服务器B的命令行不再需要输入密码。如果失败了怎么办这是最有价值的部分。请按以下顺序排查检查权限最常见 在服务器B上执行ls -la ~/.ssh/。确保.ssh目录权限是drwx------(700)。authorized_keys文件权限是-rw-------(600)。 如果不是用chmod命令修正。检查公钥内容 在服务器B上用cat ~/.ssh/authorized_keys查看文件内容。确认公钥是完整的一行没有换行、没有多余空格。最好与服务器A上的cat ~/.ssh/id_rsa.pub输出对比一下。查看SSH服务端日志 在服务器B上查看SSH的认证日志通常位于/var/log/auth.log(Debian/Ubuntu) 或/var/log/secure(CentOS/RHEL)。使用sudo tail -f /var/log/auth.log然后在服务器A上再次尝试连接观察日志输出。常见的错误信息会直接告诉你原因比如 “Authentication refused: bad ownership or modes for file ...”权限问题。检查服务端SSH配置 确保服务器B的SSH服务配置允许密钥认证。检查/etc/ssh/sshd_config文件需要sudo权限sudo grep -E ^PubkeyAuthentication|^AuthorizedKeysFile /etc/ssh/sshd_config输出应该包含PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys。如果修改了配置需要重启SSH服务sudo systemctl restart sshd。4. 进阶场景多服务器与密钥管理当你需要从一台客户端管理多台服务器或者在多台服务器之间互相免密登录时简单的id_rsa默认密钥就不够用了。4.1 为不同服务器使用不同密钥对这是最佳实践。例如你管理着生产集群和测试集群应该使用不同的密钥对方便隔离和吊销。生成指定名称的密钥ssh-keygen -t rsa -b 4096 -C my_laptop_to_prod -f ~/.ssh/id_rsa_prod ssh-keygen -t ed25519 -C my_laptop_to_test -f ~/.ssh/id_ed25519_test-f参数指定生成的文件名。这会生成id_rsa_prod、id_rsa_prod.pub和id_ed25519_test、id_ed25519_test.pub两对密钥。使用-i参数指定私钥连接ssh -i ~/.ssh/id_rsa_prod userprod-server ssh -i ~/.ssh/id_ed25519_test usertest-server4.2 配置SSH客户端Config文件告别冗长命令每次带-i参数太麻烦。可以在客户端比如你的本地电脑或跳板机的~/.ssh/config文件中为每台服务器创建别名和配置。编辑~/.ssh/config文件如果不存在就创建Host prod-web-01 # 自定义的别名方便记忆 HostName 192.168.100.10 # 服务器的真实IP或域名 User ubuntu IdentityFile ~/.ssh/id_rsa_prod # 指定使用的私钥 Port 22 # 默认22如果改了端口这里要指定 Host test-db-01 HostName test-db.example.com User deploy IdentityFile ~/.ssh/id_ed25519_test Host jump-server # 跳板机配置 HostName jump.example.com User admin IdentityFile ~/.ssh/id_rsa_jump保存后你就可以直接用别名登录了ssh prod-web-01 # 等价于 ssh -i ~/.ssh/id_rsa_prod ubuntu192.168.100.10 ssh test-db-01vscode ssh和cursor 配置ssh免密登录等编辑器在配置远程连接时本质上也是读取或让你配置类似的信息。一个组织良好的config文件能极大提升效率。4.3 实现多台服务器互相免密登录集群互信在Hadoop、Spark、K8s集群初始化等场景中可能需要所有节点两两之间可以免密登录。手动操作N台服务器是N^2的复杂度。通常采用自动化脚本在一台管理节点上生成密钥对或者使用一个共用的密钥。将公钥分发到所有目标节点包括管理节点自己。可以使用像Ansible、Puppet这样的配置管理工具或者写一个简单的Shell循环脚本结合ssh-copy-id和主机列表文件。重要安全警告在生产环境中让所有服务器互相持有对方的免密登录权限是极高的安全风险。一旦一台服务器被攻破整个集群沦陷。更安全的做法是使用“跳板机”Bastion Host模式或基于证书的SSHSSH CA实现集中式的权限管控。ssh批量登录的需求应谨慎对待优先考虑通过跳板机配合ProxyJump或ProxyCommand指令来实现受控访问。5. 集成与工具现代工作流中的免密登录理解了基本原理再看那些热搜词就清晰了gitlab配置ssh密钥/github添加ssh密钥这就是把你本地生成的公钥cat ~/.ssh/id_rsa.pub复制粘贴到GitLab或GitHub网站设置里的SSH Keys页面。之后git clone gitgitlab.com:...这样的操作就不再需要输密码了。gitee代码如何通过公钥拉到本地同理。vscode连接ssh远程服务器/remote sshVSCode的Remote-SSH插件会让你选择一个本地的SSH配置文件通常就是~/.ssh/config或者手动输入userhost。插件在背后就是利用你配置好的私钥去进行认证。如果连接失败检查点往往就是config文件语法、私钥路径、权限以及服务端的authorized_keys。bitvise ssh client这是一款Windows下强大的图形化SSH客户端。它内置了密钥对管理工具Keypair Manager可以生成、导入、导出密钥并在连接配置中直接选择使用哪个私钥文件图形化操作降低了门槛。ssh软件像PuTTYWindows这样的软件它们使用自己的密钥格式.ppk。你需要用PuTTYgen工具将OpenSSH格式的私钥id_rsa转换成.ppk格式或者在PuTTYgen中直接生成密钥对。其原理与OpenSSH完全一致。最后关于python 是 用 gpg 对称 密码 来加密的 ,没有私钥 现在要解密怎么解密和rsa 公钥 私钥 加签验签它们虽然也涉及非对称加密但属于GPG和密码学应用范畴与SSH免密登录的密钥使用场景不同。简单来说没有私钥解密用公钥加密的数据在计算上是不可行的这正是非对称加密的安全基础。而加签是用私钥对数据的摘要进行加密生成签名验签是用公钥解密签名并比对摘要用于验证数据完整性和来源这与SSH登录的挑战-响应认证模式在数学原理上同源但应用目的不同。配置免密登录的整个过程最磨人的往往不是步骤本身而是遇到问题时的那份耐心。我的经验是永远把ssh -vverbose详细模式当成最好的朋友。在客户端执行ssh -v userhost它会打印出连接、认证的每一步细节就像给你了一台SSH协议的显微镜绝大多数“莫名其妙”的失败原因都会暴露无遗。另外养成好习惯为不同的环境、不同的用途生成独立的密钥对并用~/.ssh/config文件管理起来。当某台服务器权限需要回收时你只需要从它的authorized_keys文件中删除对应的那一行公钥即可不会影响到其他服务。
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻