直接在华为云上买过Centos服务器的朋友,估计都经历过这么一个场景:控制台创建实例的时候,系统提示你设置登录方式,很多人随手就选了“密码登录”,然后设置一个自己都觉得难记的密码。等服务器开了,通过VNC或者SSH密码登上去,看似一切顺利。但用久了你会发现,密码登录带来的问题比想象中多——密码泄露、暴力破解、日志里一堆Failed Password的记录......后来我把自己在华为云上跑的所有Centos实例全部切成了密钥方式登录,实测下来不仅安全性上了一个台阶,日常操作反而更省事。
这篇文章就把我从“用密码”到“只用密钥”的完整过程、配置细节和踩过的坑全部整理出来,覆盖从华为云控制台创建密钥对、绑定到Centos实例、本地客户端连接配置到常见报错排查的完整链路。不管你是刚买第一台华为云服务器的新手,还是想把手头所有实例都切换成密钥登录的老手,这篇文章里的步骤都可以直接照着抄。
1. 为什么要用密钥登录:密码方式在云服务器场景下真的不够用
1.1 密码登录的三个现实痛点
先说最直接的痛点。云服务器和家里那台NAS不一样,它的SSH端口默认是暴露在公网上的,这意味着全世界任何一个角落的人,只要知道你的IP,就能尝试用常见用户名和密码去“撞”。我自己的服务器在启用密钥登录之前,检查过日志,光是22端口上的暴力破解尝试,一天就有几百上千次。虽然我用的密码足够复杂,但这种事就像天天有人在你家门口试钥匙,就算门锁再结实,心里也不踏实。
第二个问题是密码本身的管理成本。一台两台服务器还好,如果服务器多了,每个实例都要设一个不重复的强密码,要么靠密码管理器记,要么就在某个地方存一份明文清单。而这份清单一旦泄露,所有服务器全部沦陷。更麻烦的是,某些团队场景下,成员离职后还得逐个修改所有服务器的密码,运维成本极高。
第三个问题,也是最容易忽略的:密码登录方式下,密码本身会通过网络传输。虽然SSH协议是加密的,但如果你用的是弱密码,字典攻击直接在服务端就能碰运气撞开。更别说某些云平台的安全组配置不当,或者客户端机器中了马,密码被记录下来。相比之下,密钥方式用的是非对称加密的一对“钥匙”,私钥不参与网络传输,只在本地持有,安全模型完全不一样。
1.2 密钥登录的原理:一把锁配一把钥匙,钥匙不出门
密钥登录说白了就是一套“公钥加密、私钥解密”的非对称加密体系。你可以把公钥理解成一把只有锁芯的锁,把这把锁放到服务器上;私钥是你手里的一把专用钥匙。你把锁安在服务器门上,每次要进门的时候,服务器会拿出一道谜题,你用私钥解开,服务器确认你是钥匙的持有者,就放行。
整个过程中,私钥永远只存在于你的本地电脑里,不需要上传到任何地方,也不会在网络里传来传去。而公钥哪怕被任何人拿走都没关系,因为它只能用来验证你的私钥,无法反推出私钥。这就是为什么密钥登录比密码登录更安全——密码在认证过程中会触碰网络,私钥不会。
在Centos这类Linux发行版上,这套机制落地到OpenSSH服务里,就是两个文件的事:服务端存放公钥的文件叫~/.ssh/authorized_keys,客户端持有私钥文件。连接的时候,SSH客户端用私钥签名,服务端用公钥验签,一来一回,认证就完成了。
1.3 哪些场景特别适合用密钥登录
- 个人开发者手里有多台华为云ECS,希望统一身份认证,不用记多套密码
- 需要做自动化部署、CI/CD流水线,脚本里用密码登录既不安全也不方便,密钥方式可以免交互
- 团队协作场景,每个成员有独立的密钥,服务器侧通过authorized_keys统一管理,哪个人离职了只需删一条记录
- 希望降低暴力破解风险,同时保留用密码作为应急兜底手段
2. 华为云创建密钥对的完整流程与细节
2.1 进入密钥对管理页面
操作路径很直接:登录华为云控制台,在顶部搜索框输入“密钥对”,或者在“计算 > 弹性云服务器 ECS”的左侧导航栏里找到“密钥对”菜单。
这里要提醒一句:密钥对是分区域(Region)的,你在华北-北京四创建的密钥对,在华东-上海一是不存在的。所以创建密钥对之前,先确认服务器所在区域,否则后面绑定的时候会找不到密钥。这个看似细小的点,我见过不少新同事踩过。
进入密钥对管理页面后,点击“创建密钥对”按钮。
2.2 创建密钥对时的关键参数与私钥下载
创建密钥对的对话窗口里有几个关键选项,逐个说一下:
- 密钥对名称:自定义就好,建议用有辨识度的名称,比如
ecs-centos-dev或者ops-passwordless,方便后续多个密钥对时区分 - 密钥类型:华为云支持SSH_RSA和SSH_ED25519两种。如果客户端环境都比较新,建议选ED25519,算法更高效,密钥更短;如果考虑到老系统兼容性,选SSH_RSA也没问题
点击“确定”后,系统会立即生成密钥对,并自动弹出一个下载私钥文件的提示。这里有一个极其关键的注意点:私钥文件只在这个时刻提供一次下载,关闭窗口后就再也无法从华为云控制台获取了。所以下载下来的私钥文件,一定要妥善保存。我个人的建议是:
- 立即把私钥文件移动到本机的
~/.ssh/目录(macOS/Linux)或指定安全目录(Windows),不要一直放在“下载”文件夹里 - 对私钥文件设置合适的权限,这个后面专门说
- 最好在一开始就批量创建几个密钥对,分别用于开发环境、生产环境,避免以后复用同一把钥匙导致权限边界模糊
下载下来的私钥文件,在Windows上通常是.pem格式,在Linux/macOS上也是一个文本文件。这个文件里包含了完整的私钥内容,开头一般是-----BEGIN RSA PRIVATE KEY-----或者-----BEGIN OPENSSH PRIVATE KEY-----。
2.3 密钥对的三种使用时机
华为云上的密钥对不是只能在新购服务器时用,实际上有三种场景:
- 新购ECS实例时直接绑定:在“购买弹性云服务器”的向导里,登录方式选择“密钥对”,然后下拉选择一个已有的密钥对
- 对已有ECS实例重置密钥对:在ECS实例的详情页,找到“重置密钥对”或“更换密钥对”的选项。可以解绑旧的密钥对,绑定新的
- 通过控制台VNC登录后手动配置:这是纯手动方案,在服务器里面操作
authorized_keys文件
前面两种是华为云控制的,第三种是灵活的通用方案。本篇重点覆盖场景一和场景二,也就是云平台托管的密钥方式。
3. 购买并绑定Centos云服务器实例
3.1 购买ECS实例时的登录方式选择
在华为云上购买弹性云服务器ECS时,有几个配置需要按实际情况来选择:
- 镜像类型:选择“公共镜像”,操作系统选 CentOS,版本按需求选。CentOS 7.9 目前还是很常见的稳定选择,CentOS Stream 或者 8.x 也可以,但要注意官方支持周期
- 登录凭证:这里就是关键了,选择“密钥对”,然后在密钥对下拉框里选择之前创建好的密钥对
- 云硬盘、网络、安全组等按常规配置即可
这里要特别说一句:如果你购买的是竞价计费实例或者按需实例,建议在购买前就把密钥对准备好,因为竞价实例的启动速度很快,如果临时抱佛脚创建密钥对,可能会来不及绑定。
3.2 首次启用密钥登录前,安全组别拦错端口
SSH默认走22端口,所以在安全组规则里,要确保入方向放行了TCP 22端口。我遇到过一种情况:远程端口改了,比如改成2222,但是安全组里没放行,结果密钥配得再对也连不上。
华为云安全组规则配置入口在“控制台 > 网络 > 虚拟私有云 VPC > 安全组”,找到实例绑定的安全组,添加入方向规则:
- 优先级:默认1即可
- 策略:允许
- 协议端口:TCP 22
- 源地址:如果要更严格,可以只填你自己的公网IP或者办公网段;如果图省事,可以填
0.0.0.0/0,但我不建议这么做。把源地址收紧,是低成本高收益的加固手段
另外,如果服务器有弹性公网IP(EIP),记得先绑定好EIP,否则本地无法直接通过公网访问。
3.3 已有密码登录实例,如何切换到密钥登录又不断连
如果你手头已经有通过密码登录的Centos实例,想切换到密钥登录,最稳妥的方式是先在本地生成密钥对,然后把公钥追加到服务器的“authorized_keys”文件中。步骤大概是:
- 本地生成密钥对(如果还没有的话)
- 用密码登录服务器
- 编辑
~/.ssh/authorized_keys,把公钥内容追加进去 - 测试密钥登录成功后,再决定是否彻底关闭密码登录
这条路径的好处是,即使密钥登录配置失败,你仍然可以通过密码登录进入服务器修复,不会把自己锁在门外。所以我在实际操作中,都是先“添加密钥认证”,测试通过后再“禁用密码认证”,而不会一步到位。
4. 本地客户端连接Centos前的准备工作
4.1 Windows系统:用PuTTY还是直接用OpenSSH
Windows用户登录华为云Centos服务器,常见有两种方式:
第一种,用Windows 10/11自带的OpenSSH客户端,直接在PowerShell或者CMD里敲命令。这种方式最轻量,推荐优先使用。检查方法是打开PowerShell,输入ssh,如果提示使用方法,说明已经有了。如果没有,可以在“设置 > 应用 > 可选功能”里添加“OpenSSH 客户端”。
第二种,用PuTTY。PuTTY的好处是图形化界面,而且自带PuTTYgen可以处理密钥格式转换。但要注意,华为云下载下来的私钥文件通常是OpenSSH格式,PuTTY直接识别不了,需要用PuTTYgen做一次格式转换:
- 打开PuTTYgen,点击“Load”加载私钥文件
- 加载时文件类型要选择“All Files (.)”
- 加载成功后,点击“Save private key”,保存为PuTTY的
.ppk格式 - 在PuTTY的“Connection > SSH > Auth”里加载这个ppk文件
这一步是Windows上最容易出问题的地方,很多人用PuTTY登录报错“Unable to use key file”,绝大多数都是因为没做格式转换。
4.2 macOS/Linux:直接使用OpenSSH,零额外依赖
macOS和主流Linux发行版自带的OpenSSH客户端直接就能用,无需安装任何额外工具。私钥文件下载后,我建议立刻移动到~/.ssh/目录下,然后执行:
mv ~/Downloads/your-key.pem ~/.ssh/your-key.pem chmod 400 ~/.ssh/your-key.pem到这里文件就准备好了,连接命令很简单:
ssh -i ~/.ssh/your-key.pem root@你的服务器IP4.3 私钥文件权限:chmod 600还是400,为什么太宽松会报错
之所以要把私钥权限改到600或400,是因为OpenSSH客户端有一个安全机制:如果发现私钥文件的权限过于宽松,比如其他用户也能读,它会直接拒绝使用这个密钥,并报出类似这样的错误:
Permissions 0644 for 'your-key.pem' are too open.这个设计初衷很好,防止私钥被同机器的其他用户窃取。权限数字对照:
- 400:所有者只读,这是最安全的
- 600:所有者可读可写,也可以接受
千万避免使用644这种默认下载权限。我的做法是统一设成400,因为私钥文件只需要读,不需要写。
4.4 常见SSH客户端一览
| 客户端 | 平台 | 特点 | 适合人群 |
|---|---|---|---|
| OpenSSH命令行 | Linux/macOS/Windows | 轻量、脚本友好 | 所有用户 |
| PuTTY | Windows | 图形化、老牌 | 习惯图形界面的用户 |
| Termius | Windows/macOS/Linux/移动端 | 跨端同步、界面现代 | 多设备用户 |
| Visual Studio Code Remote-SSH | 各平台 | 编辑器集成、开发方便 | 开发人员 |
| Xshell | Windows | 标签页管理、功能丰富 | 运维人员 |
实际使用中,我自己最常用的还是命令行OpenSSH加VS Code Remote-SSH,前者用于快速登录,后者用于写代码和改配置。
5. 实战:密钥方式登录Centos服务器的完整过程
5.1 命令行方式登录的详细解析
假设你已经有一台华为云Centos服务器,EIP是1.2.3.4,私钥文件在~/.ssh/ecs-centos.pem。登录命令:
ssh -i ~/.ssh/ecs-centos.pem root@1.2.3.4如果一切正常,你会直接进入服务器的shell,没有密码输入过程。第一次连接时,如果服务器不在known_hosts里,会有一个确认提示:
The authenticity of host '1.2.3.4 (1.2.3.4)' can't be established. ECDSA key fingerprint is SHA256:xxxxxxxxxxxxxxxxxxxxxxx. Are you sure you want to continue connecting (yes/no/[fingerprint])?输入yes回车即可。
这里有个优化点:如果你希望以后不用再指定私钥文件路径,可以在~/.ssh/config里配置主机别名。例如建一个~/.ssh/config文件,内容如下:
Host my-centos HostName 1.2.3.4 User root IdentityFile ~/.ssh/ecs-centos.pem保存后,以后只需要执行ssh my-centos就能直接登录,不用记IP、用户名、密钥路径。
5.2 Windows下用PuTTY登录的图形化操作
如果你选择PuTTY,界面上的操作分四步:
- 在“Session”页面,Host Name填服务器EIP,Port填22,Connection type选SSH
- 在左侧“Connection > SSH > Auth”中,点击“Browse”,选择转换好的ppk私钥文件
- 回到“Session”页面,在Saved Sessions里填一个名字,点“Save”,方便下次直接双击加载
- 点击“Open”开始连接,首次连接会弹出指纹确认,点“Accept”即可
登录进去以后,PuTTY的窗口会自动以root身份(或者你创建的用户)进入系统。
5.3 首次登录后的系统自查清单
密钥登录成功,只是万里长征第一步。进了系统之后,我建议按这个顺序做一遍基础体检,确保后续使用不踩坑:
# 查看系统版本 cat /etc/centos-release # 查看内核 uname -a # 检查SSH服务状态 systemctl status sshd # 查看是否有异常登录记录 last -n 20 # 检查密钥是否已经生效到authorized_keys cat ~/.ssh/authorized_keys # 查看磁盘空间 df -h确认无误后,可以顺手做两件小事:一是把系统时间校准一下,安装chrony或使用ntpdate同步时间;二是更新一下系统软件包缓存。这些和密钥登录本身无关,但属于服务器初始化应有的操作。
5.4 登录日志验证与安全确认
登录成功之后,可以通过服务端日志确认这次登录是通过密钥认证而非密码认证。执行:
sudo grep sshd /var/log/secure | tail -20在日志里,如果看到类似这样的一行:
Accepted publickey for root from 1.2.3.4 port 52314 ssh2: RSA SHA256:xxxxxxxx这就说明这次登录是公钥认证成功。而如果是密码登录,日志里一般是:
Accepted password for root from 1.2.3.4 port 52314 ssh2养成查看登录日志的习惯,可以帮你及时发现异常认证行为。
6. 常见问题与排查技巧实录
6.1 Permission denied (publickey) 的排查流程
密钥方式登录时最常见的报错就是:
root@1.2.3.4: Permission denied (publickey,gssapi-keyexch,chost)这个问题产生的原因有很多,不要急,按顺序排查:
- 先确认自己用的用户名对不对。如果是Centos公共镜像,默认用户是root
- 确认私钥文件路径是否正确,有没有输错
-i参数 - 确认私钥权限是不是400或600,执行
ls -l ~/.ssh/your-key.pem检查 - 确认服务器上
authorized_keys文件里是否有对应的公钥 - 确认SSH服务配置文件
/etc/ssh/sshd_config里没有禁用公钥认证,关键参数是PubkeyAuthentication yes - 确认SELinux没有拦截SSH对 authorized_keys 文件的访问
这个排查顺序基本能覆盖90%的“Permission denied”场景。我自己碰到过最奇葩的一次,是服务器上/root目录权限变成了777,结果sshd因为目录权限过宽拒绝读取authorized_keys文件。把/root权限改回700后问题消失。
6.2 私钥文件权限报错的两种处理办法
如果Windows下用OpenSSH登录,有时会遇到:
Bad permissions. Try removing permissions for others.解决办法有两个:
一是在PowerShell里用icacls命令修改权限:
icacls .\your-key.pem /inheritance:r /grant:r "%USERNAME%:R"二是直接把私钥文件复制到一个干净的目录,然后右键 > 属性 > 安全,把除了当前用户之外的所有用户都删掉,并确保Administrators没有读权限。
换到macOS或Linux下,就是老生常谈的chmod 400 your-key.pem。
6.3 密钥登录失败时的应急兜底:华为云VNC
如果你在本地怎么调都连不上,最可靠的后备方案是华为云控制台自带的VNC登录。在ECS实例列表的操作列,点击“远程登录”,就能打开一个网页版的终端。这个终端完全走云平台内部通道,不依赖SSH端口,不需要密钥,也不依赖你在本地配置的客户端,如果VNC能登上,说明服务器本身没问题,问题出在密钥或SSH配置层面。
VNC登录进去后,你就可以检查ssh配置、authorized_keys文件、权限问题等。这种“带外管理”通道是云服务器相比物理机的一大优势,关键时刻能救命。
6.4 私钥丢失后的补救方案
假设你的私钥文件被误删了,或者本地电脑坏了,该怎么登录服务器?
华为云控制台提供了“重置密钥对”的功能。在ECS实例详情页,找到“密钥对”相关选项,选择重置为新的密钥对,然后下载新的私钥文件。这个过程需要你通过控制台的登录凭证或VNC先做身份验证,验证通过后即可执行。
这是云托管的密钥对和自建密钥对最大的区别:云平台在密码之外,还留了一个带外管理的入口,让你在私钥失效时还有恢复的办法。
但如果你当初是手动在服务器上配置的authorized_keys,并且云平台侧没有保留公钥记录,那恢复流程会复杂得多。这也是为什么我比较推荐直接用华为云托管的密钥对功能,而不是完全手动自建。
6.5 使用密钥登录后还需不需要保留密码登录
如果你已经确认密钥登录稳定可用,可以考虑在sshd_config里禁用密码认证:
PasswordAuthentication no修改完成后,重启sshd服务:
sudo systemctl restart sshd这里有个重要提醒:在禁用密码认证之前,一定要先确认你至少有一条可用的密钥登录途径。否则一旦配置错误,或者密钥在客户端丢失,你又没开启VNC或绑定其他登录方式,那就真的是“进不了门”了。
我的建议是:第一步先启用密钥认证,第二步通过密钥登录测试几天,第三步再关闭密码认证。整个过程给足自己缓冲。
7. 密钥管理的进阶实操与安全习惯
7.1 多服务器场景下的密钥组织方式
如果你有多台华为云ECS,不建议所有服务器共用同一把私钥。虽然共用一把密钥操作最方便,但一旦私钥泄露,所有服务器都暴露无遗。比较好的做法是:
- 按环境划分:开发环境一组密钥、生产环境一组密钥
- 按项目划分:每个项目组使用独立的密钥对
- 按人划分:每个团队成员有一个独立的密钥,公钥加入服务器的authorized_keys
按人划分时,在华为云上创建密钥对并下载私钥,然后把公钥内容配置到服务器上。这样哪个人离职了,只需要把对应的公钥从服务器上删掉,其他人不受影响。
7.2 利用ssh config管理多主机连接
服务器多了以后,IP地址、用户名、密钥路径很容易记混。我强烈建议在客户端配置~/.ssh/config文件来统一管理,语法很简洁:
Host prod-web1 HostName 1.2.3.4 User root IdentityFile ~/.ssh/prod-web1.pem Host prod-web2 HostName 1.2.3.5 User root IdentityFile ~/.ssh/prod-web2.pem配置好后:
ssh prod-web1即可直连,完全不用记IP和密钥路径。VS Code的Remote-SSH也支持读取这个config文件,在开发环境里配置好后,打开VS Code就能直接选择远程主机,效率会明显提升。
7.3 定期轮换密钥的策略
密钥和密码一样,需要定期轮换。华为云的密钥对管理页面支持删除旧的密钥对并创建新的,配合ECS的重置密钥对功能,可以做到比较平滑的轮换:
- 在华为云创建新的密钥对
- 在ECS实例上执行“重置密钥对”,绑定新密钥
- 本地用新私钥测试登录
- 确认无误后,把旧密钥对从华为云控制台删除,同时删除本地旧私钥
轮换周期可以根据团队安全策略来,个人使用的话一年一次也不算频繁。关键是不要一次轮换太多服务器,分批次进行,可以降低操作失误的风险。
7.4 与密码登录相比的整体安全收益
最后从安全收益角度做一个对比,方便你给团队决策时解释:
| 维度 | 密码登录 | 密钥登录 |
|---|---|---|
| 暴力破解 | 容易被字典攻击 | 无法暴力破解 |
| 密码泄露风险 | 网络传输、中间人风险 | 私钥不触网 |
| 多服务器管理 | 多密码难以管理 | 统一密钥策略 |
| 自动化支持 | 需要expect等技巧 | 原生免交互 |
| 审计与回收 | 需要逐个改密 | 删除公钥即可回收 |
从我个人的实际体验来说,华为云服务器 + Centos + 密钥登录这套组合,最直观的感受是日志里再也没有海量的Failed Password攻击记录了,配合修改SSH默认端口和配置fail2ban的话,基本上可以睡个安稳觉。如果你想在这条路上再深挖一步,可以研究一下在Centos上配置双因素认证(比如结合TOTP),把密钥验证和OTP验证叠加起来用,那是另一个安全级别的玩法。
这里也分享一个小习惯:任何时候在服务器上修改SSH相关配置,我都是先开一个新的连接测试,确认没问题后再关闭旧连接,而不是直接在一个连接里改了配置又重启ssh。毕竟,SSH配置改错的后果经常是直接把自己锁在门外。