云服务器到底是怎么登录的?一文讲清密码登录与密钥对登录的原理

引言

拿到一台云服务器(阿里云 ECS、腾讯云 CVM、AWS EC2 等),第一件事就是登录上去。但很多人对「登录」这件事的理解停留在「输密码」层面——其实云服务器最常见的登录方式并不是密码,而是一对「钥匙」。这篇文章把登录云服务器的几种方式和背后的原理讲清楚。

一、登录的本质:验证「你是谁」

无论哪种登录方式,本质都是回答服务器的一个问题:

你怎么证明你是这个账号的主人?

证明方式通常有三种,也就是三种常见的「认证因子」:

  1. 你知道的东西(Something you know)—— 密码
  2. 你拥有的东西(Something you have)—— 私钥文件、硬件令牌、手机
  3. 你是什么(Something you are)—— 指纹、虹膜等生物特征

云服务器登录主要用前两种:密码和密钥对。

二、方式一:密码登录

用法

ssh root@服务器IP
# 然后输入密码

原理

密码登录是最直观的方式。流程如下:

  1. 客户端发起 SSH 连接,先协商加密算法、交换密钥,建立一条加密通道(这一步是 SSH 传输层协议,任何认证方式都要先经过它);
  2. 服务器向客户端索要密码;
  3. 客户端把密码通过加密通道发送过去(明文密码不会被网络抓包看到,因为它已经被通道加密了);
  4. 服务器拿到密码后,与 /etc/shadow 里存储的密码哈希比对;
  5. 一致则通过,不一致则拒绝。

优缺点

  • ✅ 简单直观,适合临时登录、紧急排查;
  • ❌ 容易被暴力破解(撞库、字典攻击),云服务器公网 IP 天天都在被扫描,root 密码若设得太弱,几分钟就可能被攻破;
  • ❌ 密码需要记忆/管理,多台服务器密码各不同很痛苦。

所以生产环境的云服务器,默认通常关闭密码登录,只保留密钥对登录。

三、方式二:密钥对登录(重点)

这是云服务器默认且推荐的登录方式,也是本文的重头戏。

用法

ssh -i 私钥文件.pem root@服务器IP

原理:非对称加密

密钥对登录的底层是非对称加密(也叫公钥密码学)。

密钥对由一对「数学上相关、但不能互相推导」的钥匙组成:

私钥(Private Key) 公钥(Public Key)
保存位置 只有你自己有(本地电脑) 放在服务器上
作用 用于签名 / 解密 用于验签 / 加密
能否公开 ❌ 绝对不能 ✅ 可以随便公开

核心特征:

  • 用公钥加密的内容,只有私钥能解开;
  • 用私钥签名的内容,任何人都能用公钥验证真伪。

关键点在于:私钥永远不离开你的电脑。登录时,私钥不会上传到服务器,服务器只是用你提前放上去的公钥来「验证」你是不是真的持有对应的私钥。

登录握手流程(一步步拆解)

假设你已经把公钥放到了服务器的 ~/.ssh/authorized_keys 文件里,现在要登录:

第 0 步:准备阶段(一次性)

ssh-keygen -t ed25519
# 把公钥(.pub 文件)内容追加到服务器 ~/.ssh/authorized_keys

第 1 步:客户端发起认证请求

客户端告诉服务器:「我是 root,想用公钥认证,我的公钥是 XXXXX」。

第 2 步:服务器核对公钥

服务器查看这个公钥是否在 root 的 authorized_keys 里。不在 → 直接拒绝;在 → 继续。

第 3 步:服务器发出「挑战」(Challenge)

服务器生成一段随机数据(challenge),发给客户端,说:「既然你说你有私钥,那就用私钥给这段数据签个名证明一下」。

第 4 步:客户端用私钥签名

客户端用本地私钥对这段 challenge 进行签名,把签名结果发回服务器。

第 5 步:服务器用公钥验签

服务器用之前存的公钥验证签名:

  • 验签通过 → 证明客户端确实持有对应私钥 → 认证成功,允许登录;
  • 验签失败 → 拒绝。

为什么这种方式安全?

想象一个类比:

服务器是一把锁,公钥是挂在门上的锁,私钥是唯一能开这把锁的钥匙。

登录时,服务器不是检查你「是不是带了对的钥匙」,而是说:「你如果能打开这把锁,就证明你带着对的钥匙」。你拿出私钥「开锁」证明自己,但钥匙从头到尾没有递出去过。

安全性体现在三点:

  1. 私钥不出门:整个登录过程私钥只在你本地参与签名,从不发送到网络,攻击者抓包也拿不到私钥;
  2. 公钥泄露无害:即使公钥被偷,也只能验签,无法冒充你登录;
  3. 无法暴力破解:挑战是随机数,且密钥长度(如 2048/3072 位 RSA、256 位 Ed25519)远超暴力穷举能力。

补充:为什么「challenge 用公钥加密」这种说法不准确?

有些文章会简化成「服务器用公钥加密一个随机数发给你,你用私钥解密」。这个描述不准确。

实际上 SSH 公钥认证用的是签名验签,而不是「加密/解密」:

  • 服务器发的是明文 challenge(不需要保密);
  • 客户端用私钥对它签名
  • 服务器用公钥验签

加密和解密是另一回事(比如 HTTPS 里用公钥加密会话密钥)。SSH 认证靠的是签名,别混为一谈。

四、其他登录方式(补充)

除了上面两种,云服务器还有几个入口:

1. Web 控制台 / VNC

云厂商控制台里的「远程连接」,本质是浏览器内嵌的网页终端或 VNC,不依赖网络上的 SSH 服务。

  • ✅ 好处:即使你把 SSH 端口配错、防火墙封死、甚至误删了密钥,还能通过控制台「救急」进去修复;
  • ❌ 坏处:只能手动操作,无法自动化、无法传文件、不适合批量管理。

2. 云厂商的「实例管理」Agent

部分厂商提供内置命令通道(如阿里云的云助手、AWS 的 SSM),能绕过 SSH 直接下发命令。适合自动化运维,但属于「另一套体系」,不在本文展开。

五、对比总结

维度 密码登录 密钥对登录
凭据 记在脑子里 存在私钥文件里
暴力破解风险 高(可穷举) 极低(密钥极长 + 随机挑战)
私钥是否上网 否,永远不出本机
多服务器管理 每台要记不同密码 一把私钥可配多台
丢失/泄露后果 改密码即可 需更换密钥对
云厂商默认 通常关闭 默认推荐

六、最佳实践建议

  1. 关闭密码登录:在 /etc/ssh/sshd_config 里设 PasswordAuthentication no,只留密钥登录;
  2. 别用 root 直接登录:新建普通用户登录,需要时再 sudo
  3. 保护好私钥:本地权限设为 chmod 600,永不提交到代码仓库;
  4. 定期轮换密钥:尤其怀疑私钥泄露时,重新生成并替换 authorized_keys
  5. 优先用 Ed25519:比 RSA 更短、更快、安全性同等甚至更高(ssh-keygen -t ed25519)。

结语

「登录云服务器」看似一句话的事,背后是一套严谨的密码学设计:先用对称加密建立安全通道,再用非对称加密完成身份认证。理解了「私钥签名、公钥验签、私钥不出门」这三点,你就真正理解了密钥对登录的安全根基。