三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Xshell 7配置SSH密钥登录RHEL7/CentOS7服务器全攻略

Xshell 7配置SSH密钥登录RHEL7/CentOS7服务器全攻略

1. 项目概述:为什么我们需要告别密码登录?

每次登录服务器都要输入一长串密码,烦不烦?输错了还得重来,更别提密码泄露的风险了。作为一名常年与Linux服务器打交道的运维或开发者,我敢说,SSH密钥登录是提升效率和安全性的第一个必选项。它不仅仅是“不用输密码”这么简单,其背后是一套基于非对称加密的认证机制,从根本上杜绝了暴力破解和密码嗅探的风险。想象一下,你的私钥就像一把独一无二的、极其复杂的物理钥匙,而公钥则是安装在服务器锁芯里的锁芯模具。只有完全匹配的钥匙才能打开这把锁,而通过网络传输的,永远只是“尝试开锁”的请求信号,而非钥匙本身。这种方式比传统的“密码”口令安全得多。

本教程将手把手带你使用最流行的终端工具之一——Xshell 7,在RHEL7或CentOS7系统上完成从生成密钥对到最终实现免密登录的全过程。无论你是刚接触Linux的新手,还是需要为团队统一配置环境的老手,这篇保姆级指南都能让你一次搞定,告别繁琐的密码输入时代。我们将覆盖所有关键细节,包括Xshell 7的密钥生成参数选择、服务器端SSH服务的关键配置、权限设置的“坑”,以及如何适配RHEL7/CentOS7这类较老但依然广泛使用的系统版本。

2. 核心原理与工具选型解析

2.1 SSH密钥认证是如何工作的?

在动手之前,理解原理能帮你避开很多配置上的陷阱。SSH密钥认证依赖于一对非对称加密密钥:私钥和公钥。

  • 私钥:必须绝对保密,存放在你的本地客户端电脑上(比如你的Windows电脑上的Xshell配置里)。它就像你的主钥匙,绝不能给别人。
  • 公钥:可以公开,需要上传到你想登录的Linux服务器上,并添加到对应用户的~/.ssh/authorized_keys文件中。它就像一把公开的锁芯模具。

整个登录流程可以简化理解为:

  1. 客户端发起连接请求,并告诉服务器:“我想用密钥登录”。
  2. 服务器生成一段随机字符串(挑战),用客户端提供的公钥加密后,发送给客户端。
  3. 客户端用自己的私钥解密这段字符串。
  4. 客户端将解密后的结果与另一个值组合,计算出一个哈希值(HMAC),发送回服务器。
  5. 服务器用同样的方式计算哈希值进行比对。如果匹配,则认证通过。

整个过程,你的私钥从未离开过你的电脑。即使有人截获了网络上的所有通信数据,没有私钥也无法冒充你登录。

2.2 为什么选择Xshell 7?

市面上SSH客户端很多,比如PuTTY、MobaXterm、SecureCRT,以及各类终端自带的ssh命令。我推荐Xshell 7,尤其是对于Windows用户,原因如下:

  • 用户体验优秀:界面现代化,标签式管理多个会话非常方便,支持丰富的颜色方案和字体定制,长时间操作不累眼。
  • 密钥管理集成度高:其内置的“用户密钥管理者”工具图形化界面友好,生成、导入、导出密钥一气呵成,比命令行方式更直观,特别适合新手。
  • 功能全面且稳定:支持SSH各种加密协议和算法,对中文支持良好,文件传输工具(Xftp)集成无缝,是很多企业和个人用户的首选。
  • 对旧系统兼容性好:Xshell 7在连接RHEL7/CentOS7这类默认使用较老SSH协议版本和算法的系统时,兼容性配置选项清晰,不容易出现连接失败的问题。

注意:Xshell 7个人和学校用户可以免费使用,商业用途需要购买许可证。请务必从官方网站下载,避免使用来历不明的版本。

2.3 RHEL7/CentOS7的特殊性考量

RHEL7和它的社区克隆版CentOS 7,默认安装的OpenSSH版本相对较老(通常是OpenSSH_7.4p1)。这个版本在默认安全策略上与新版本有些差异,主要体现在:

  • 默认密钥算法:可能不支持最新的Ed25519算法(虽然我们可以通过升级openssh来支持,但本教程以通用性优先,使用RSA算法)。
  • 配置文件路径与语法:主配置文件/etc/ssh/sshd_config中的某些参数默认值或推荐值可能与新系统不同。
  • SELinux与文件权限:RHEL/CentOS系列默认开启SELinux,这对~/.ssh目录和authorized_keys文件的上下文有严格要求,权限设置错误是导致密钥登录失败的最常见原因之一。

因此,我们的教程会特别强调这些适配点,确保你在这些经典系统上也能一次成功。

3. 本地准备:在Xshell 7中生成SSH密钥对

3.1 创建或打开会话并进入密钥管理

首先,确保你已安装Xshell 7。打开软件后,你可以先创建一个指向你服务器的会话(暂时先用密码登录),也可以直接开始生成密钥。

  1. 点击Xshell 7顶部菜单栏的“工具”
  2. 在下拉菜单中选择“用户密钥管理者”。这是管理所有密钥的核心工具。

3.2 生成新的密钥对

在“用户密钥管理者”窗口中:

  1. 点击左下角的“生成”按钮。
  2. 密钥类型选择:在弹出的向导中,选择密钥类型。为了最大兼容性(特别是针对RHEL7/CentOS7),我们选择“RSA”。密钥长度选择2048位4096位。2048位在安全性和兼容性上已足够,4096位更安全但生成和验证稍慢。对于绝大多数场景,2048位是平衡的选择。
  3. 生成密钥对:点击“下一步”,Xshell会开始生成密钥。期间你可以随意移动鼠标以增加随机性,加快生成速度。
  4. 设置密钥名称和密码
    • 密钥名称:给你的密钥起个容易识别的名字,例如My_CentOS7_Server_Key
    • 加密密码:这是一个可选项,但强烈建议设置。它为你的私钥再加一把“密码锁”。即使私钥文件不慎泄露,没有这个密码也无法使用。请设置一个强密码并牢记。如果怕麻烦,至少在生产环境务必设置。
  5. 完成生成:点击“完成”,你的密钥对就生成好了,并会显示在用户密钥管理器的列表中。其中“公钥”部分就是我们需要上传到服务器的内容。

3.3 导出与备份你的公钥

在密钥管理器中,选中你刚生成的密钥,点击右侧的“属性”按钮。

  1. 在属性窗口,切换到“公钥”标签页。
  2. 你会看到两栏:“公钥(用于OpenSSH)”和“公钥(用于IETF SECSH)”。
  3. 我们需要的是“公钥(用于OpenSSH)”这一栏里的全部内容。它通常以ssh-rsa AAAAB3NzaC1yc2E...开头。完整地复制这一整行文本。这就是你的公钥字符串。
  4. (重要)备份私钥:在同一个属性窗口的“常规”标签页,你可以点击“导出”按钮,将私钥保存为一个文件(通常是.ppk格式)。请将此文件妥善保管在安全的地方,例如加密的U盘或密码管理器中。这是你身份的唯一凭证,丢失将无法登录配置了该公钥的服务器。

4. 服务器端配置:让Linux服务器认识你的钥匙

现在,我们需要把刚才复制的公钥“安装”到服务器的锁芯里。假设你已经能用密码通过Xshell正常登录你的RHEL7/CentOS7服务器。

4.1 上传公钥到服务器

有多种方法可以将公钥文本放到服务器上,这里介绍最通用的两种:

方法一:使用ssh-copy-id命令(推荐,但需要客户端支持)如果你的本地电脑(比如另一台Linux或安装了Git Bash/WSL的Windows)有ssh-copy-id命令,这是最简单的方式:

ssh-copy-id -i ~/.ssh/id_rsa.pub username@your_server_ip

你需要将usernameyour_server_ip替换为你的实际用户名和服务器IP。这条命令会自动帮你完成创建目录、设置权限、追加公钥到authorized_keys文件的所有操作。但很多纯Windows环境没有这个命令。

方法二:手动创建文件(通用方法)我们通过Xshell,先用密码登录服务器,然后手动操作:

  1. 登录后,确保进入你的用户家目录:cd ~
  2. 创建.ssh目录(如果不存在),并设置极其严格的权限:
    mkdir -p ~/.ssh chmod 700 ~/.ssh
    700权限意味着只有目录所有者(你)可以读、写、进入此目录。
  3. 将你在Xshell里复制的公钥字符串,写入authorized_keys文件:
    echo "ssh-rsa AAAAB3NzaC1yc2E...(这里粘贴你的完整公钥)" >> ~/.ssh/authorized_keys
    务必确保粘贴的是完整的一行,没有多余空格或换行。
  4. authorized_keys文件设置正确的权限:
    chmod 600 ~/.ssh/authorized_keys
    600权限意味着只有所有者可以读写,其他任何用户都无权访问。

4.2 关键陷阱:SELinux上下文配置(RHEL/CentOS专属)

这是RHEL7/CentOS7上最容易踩的坑!即使文件权限正确,如果SELinux的安全上下文不对,SSH守护进程也会拒绝读取authorized_keys文件。 执行以下命令修复上下文:

restorecon -Rv ~/.ssh

这条命令会将~/.ssh目录及其下所有文件的SELinux上下文恢复为默认安全值。执行后通常就解决问题了。

4.3 修改SSH服务端配置(可选但建议)

编辑SSH服务配置文件,确保密钥认证已开启并优化安全性:

sudo vi /etc/ssh/sshd_config

找到并确认以下参数(如果被注释#,则去掉注释;如果不存在,则添加):

PubkeyAuthentication yes # 启用公钥认证 AuthorizedKeysFile .ssh/authorized_keys # 指定公钥文件路径(默认即此,检查即可) PasswordAuthentication no # 禁用密码认证(!!!谨慎操作!!!)
  • 关于PasswordAuthentication no:这是最高安全级别的设置,意味着只能通过密钥登录。在确保你的密钥登录测试成功之前,千万不要设置此项!否则一旦密钥配置失败,你将把自己锁在服务器外面。建议先注释掉或设为yes,测试成功后再改为no

检查并修改后,保存文件,重启SSH服务使配置生效:

sudo systemctl restart sshd

对于RHEL7/CentOS7,服务名通常是sshd

5. 连接测试与故障排查实录

5.1 在Xshell 7中配置会话使用密钥登录

回到Xshell 7,打开或新建一个指向你服务器的会话属性。

  1. 在“连接”类别中,填写好主机IP和端口。
  2. 切换到“用户身份验证”类别。
  3. 方法选择“Public Key”
  4. 在“用户密钥”下拉框中,选择你刚才生成的密钥(例如My_CentOS7_Server_Key)。
  5. 在“用户名”处填写你的服务器用户名。
  6. 如果你生成密钥时设置了密码,在“密码”处填写那个密钥密码(不是服务器用户密码)。
  7. 点击“确定”保存。

现在,尝试连接这个会话。如果一切配置正确,你应该能直接登录,而不会被要求输入用户密码。

5.2 常见问题与排查技巧

如果连接失败,别慌。按以下顺序排查,99%的问题都能解决:

问题1:连接被拒绝或超时

  • 排查:检查服务器IP、端口是否正确,服务器防火墙是否放行了SSH端口(默认22)。在服务器上执行sudo systemctl status sshd查看SSH服务是否正在运行。

问题2:提示“Permission denied (publickey,gssapi-keyex,gssapi-with-mic)”这是最典型的密钥认证失败提示。说明服务器尝试了公钥认证但没通过。请在服务器上依次检查:

  1. 文件权限
    • ~/.ssh目录权限必须是700(drwx------)
    • ~/.ssh/authorized_keys文件权限必须是600(-rw-------)
    • 检查命令:ls -la ~/.ssh
  2. 文件所有者~/.ssh目录和authorized_keys文件的所有者必须是登录用户本人。
    • 检查命令:ls -la ~/.ssh
  3. SELinux上下文:执行ls -Z ~/.ssh查看。确保上下文正确,如果不确定,直接运行修复命令:sudo restorecon -Rv ~/.ssh
  4. 公钥内容:检查~/.ssh/authorized_keys文件内容是否完整、正确,没有多余字符或换行。可以用cat ~/.ssh/authorized_keys查看。
  5. 服务器SSH配置:确认/etc/ssh/sshd_configPubkeyAuthentication设置为yes。并且重启了sshd服务。

问题3:Xshell弹出对话框要求输入“登录密码”或“用户密钥密码”

  • 要求输入“用户密钥密码”:这是正常的,就是你生成密钥时设置的那个密码。输入即可。
  • 要求输入“登录密码”:这说明Xshell没有成功使用密钥认证,回退到了密码认证。检查Xshell会话属性中“用户身份验证”方法是否选择了“Public Key”并正确指定了用户密钥。

问题4:服务器日志查看最权威的排查方式是查看服务器端的SSH日志。在RHEL7/CentOS7上,执行:

sudo tail -f /var/log/secure

然后尝试从客户端连接,观察服务器日志输出的实时报错信息,它能提供非常具体的失败原因。

5.3 最终加固:禁用密码登录

确保使用密钥可以稳定、可靠地登录后,你可以进行最后一步安全加固——彻底关闭密码登录。

  1. 编辑服务器/etc/ssh/sshd_config文件。
  2. 找到PasswordAuthentication这一行,将其值改为no
  3. 可选但建议:同时修改ChallengeResponseAuthenticationno
  4. 保存并重启SSH服务:sudo systemctl restart sshd

从此,你的服务器就像换上了一把只有你有钥匙的超级防盗锁,安全性大大提升。

6. 进阶管理与多服务器场景

当你管理多台服务器时,为每台服务器生成不同的密钥对是更安全的做法,但管理起来也麻烦。一个常见的实践是使用同一个密钥对登录所有你信任的服务器。只需将同一个公钥,分别追加到每台服务器的~/.ssh/authorized_keys文件中即可。

密钥轮换与更新:如果密钥疑似泄露或定期更换,你需要:

  1. 在Xshell中生成一对新的密钥。
  2. 将新公钥部署到所有服务器(追加到authorized_keys文件)。
  3. 用新密钥测试登录所有服务器,确认无误。
  4. 从服务器的authorized_keys文件中,删除旧公钥对应的那一行。
  5. 在本地安全地删除旧的私钥文件。

Xshell的会话管理:你可以将配置好密钥的会话保存为模板,或者使用“会话管理器”对大量服务器会话进行批量属性修改,这在管理成百上千台服务器时非常高效。

整个过程走下来,你会发现配置SSH密钥登录并不复杂,核心就是“本地生成密钥对,公钥上传服务器,设置正确权限”。其中最大的拦路虎往往就是Linux系统严格的权限和SELinux策略。一旦你成功配置一次,以后在新服务器上重复这个过程就会非常快。彻底告别密码,享受安全又便捷的远程管理体验吧。我个人在所有的生产服务器上都强制使用了密钥登录并禁用密码,几年下来,安全日志里清静了很多,再也没见过暴力破解的尝试,登录操作也变成了一键直达,效率提升是实实在在的。

← 返回列表