文章目录
Linux SSH 密钥登录:原理剖析与全场景配置指南(Linux/Windows)
在 Linux 服务器管理中,SSH 是远程登录的核心工具。传统密码登录存在暴力破解风险,而 SSH 基于密钥的自动登录 通过非对称加密技术,既保障了安全性,又能实现免密自动化操作(如脚本批量管理)。本文将从原理入手,详解密钥登录的协商过程,并提供 Linux 客户端与 Windows(Xshell)环境的完整配置步骤。
一、SSH 密钥登录核心原理:非对称加密的“信任机制”
SSH 密钥登录的本质是 非对称加密算法(如 RSA、ED25519) 的应用:客户端生成“私钥+公钥”一对密钥,公钥上传至服务器,私钥留存本地。登录时通过“公钥加密、私钥解密”的交互验证身份,无需输入密码。
1.1 密钥对的角色分工
- 私钥(Private Key):相当于“数字身份证”,保存在客户端本地(如 Linux 的
/root/.ssh/id_rsa),必须严格保密(权限建议设为600,避免他人读取)。 - 公钥(Public Key):相当于“锁”,上传至目标服务器的用户家目录(如
~/.ssh/authorized_keys),可公开传输,无需保密。
1.2 密钥登录的协商交互流程
整个登录过程由服务器主导验证,核心是“用公钥加密随机数,私钥解密验证”,具体步骤如下:
- 客户端发起请求:客户端(如
ssh root@192.168.66.20)向服务器发送登录请求,声明“使用密钥认证”。 - 服务器读取公钥:服务器检查目标用户(如 root)的
~/.ssh/authorized_keys文件,提取对应的公钥(若未找到,自动 fallback 到密码登录)。 - 服务器加密随机数:服务器生成一串随机数,用提取的公钥加密,将密文发送给客户端。
- 客户端解密验证:客户端用本地私钥(默认
/root/.ssh/id_rsa,或-i指定路径)解密密文,得到随机数原文。 - 客户端回传原文:客户端将解密后的随机数发送给服务器,证明“我拥有对应的私钥”。
- 服务器比对确认:服务器将客户端回传的随机数与自己最初生成的随机数比对,一致则认证成功,允许登录;不一致则认证失败,继续尝试密码登录。
简单来说:“公钥锁门,私钥开门”——只有持有对应私钥的客户端,才能解开服务器用公钥“锁”住的随机数,从而证明身份。
二、Linux 客户端:密钥登录配置步骤
Linux 客户端配置密钥登录依赖 ssh-keygen(生成密钥)和 ssh-copy-id(上传公钥)工具,默认已预装在主流发行版(CentOS、Ubuntu、Debian)中。
2.1 步骤1:在 Linux 客户端生成密钥对
通过 ssh-keygen 命令生成 RSA 密钥对(推荐 RSA 或更安全的 ED25519 算法),执行如下命令:
# -t:指定算法(rsa/ed25519,ed25519 更轻量安全)
# -P '':私钥密码为空(方便免密登录,生产环境建议设密码,用 -P "your_passwd")
# -f:指定私钥保存路径(默认 ~/.ssh/id_rsa,公钥自动加 .pub 后缀)
ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
执行后输出如下,无需额外操作,按回车确认即可:
Generating public/private rsa key pair.
Your identification has been saved in /root/.ssh/id_rsa. # 私钥
Your public key has been saved in /root/.ssh/id_rsa.pub. # 公钥
The key fingerprint is:
cb:e4:e8:69:19:86:f7:52:59:95:43:40:ce:c9:06:b9 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
| .ooo.. |
| .= .+ |
| .*. . |
| E.. |
| . So |
| . +=o. |
| o.=+ |
| .+.. |
| .o. |
+-----------------+

生成后查看密钥文件:
ls /root/.ssh/
# 输出:id_rsa(私钥) id_rsa.pub(公钥) known_hosts(已信任的服务器列表)

2.2 步骤2:将公钥上传至远程服务器
使用 ssh-copy-id 工具自动将公钥追加到远程服务器的 ~/.ssh/authorized_keys 文件(若文件不存在,会自动创建),命令格式:
# -i:指定公钥路径;root@192.168.66.20:远程服务器用户名+IP
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.100.150
首次连接会提示“确认服务器身份”,输入 yes 后,输入远程服务器的 root 密码(仅首次上传需密码):
The authenticity of host '192.168.10.23(192.168.10.23)' can't be established.
ECDSA key fingerprint is dd:6d:e8:68:72:c9:8f:d8:32:18:ba:19:6e:52:4a:60.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s)
root@192.168.10.23's password: # 输入远程服务器密码
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.66.20'"

2.3 步骤3:测试密钥登录
上传公钥后,再次通过 ssh 命令登录,无需输入密码即可成功连接:
# 直接登录远程服务器
ssh root@192.168.10.23
# 登录成功后,可执行命令验证(如查看网卡信息)
[root@remote ~]# ip addr list ens33
3: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:f0:98:fd brd ff:ff:ff:ff:ff:ff
inet 192.168.10.23/24 brd 192.168.10.255 scope global ens33
# 退出登录
[root@remote ~]# exit
logout
Connection to 192.168.10.23 closed.

三、Windows 客户端(Xshell):密钥登录配置步骤
Windows 用户常用 Xshell 作为 SSH 客户端,配置密钥登录需通过“用户密钥管理者”生成密钥,并手动将公钥上传至服务器。
3.1 步骤1:在 Xshell 中生成密钥对
- 打开 Xshell,点击顶部菜单栏 工具 > 用户密钥管理者,弹出“用户密钥管理者”窗口。
- 点击窗口右侧 生成 按钮,启动“密钥创建向导”。
- 选择密钥算法(默认 RSA,密钥长度建议保持 2048 位或更高),点击 下一步。
- Xshell 自动生成密钥对(过程需几秒),生成完成后点击 下一步。
- (可选)设置“密钥加密密码”(若为空则免密登录,生产环境建议设置密码增强安全性),点击 下一步。
- 为密钥命名(如“Linux-Server-Key”),点击 完成,密钥对会保存到 Xshell 的密钥列表中。
3.2 步骤2:复制公钥到远程服务器
- 在“用户密钥管理者”中,选中刚生成的密钥,点击 属性,在“公钥”选项卡中复制完整的公钥文本(以
ssh-rsa开头,以用户名结尾)。 - 登录远程 Linux 服务器,将复制的公钥追加到
~/.ssh/authorized_keys文件中(若文件不存在,需先创建目录和文件):# 确保 .ssh 目录存在(权限 700) mkdir -p ~/.ssh && chmod 700 ~/.ssh # 将公钥追加到 authorized_keys(权限 600,避免他人修改) echo 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1WPScj31fl+c8biyb9PbQILRX5s4fZkdaOAqy2d043edDkbVi0FHymyVELu5cIBmJ8oQIBnHAs9jQmzxyDNQoZ0hO3lUC6a9eqp0kgj/dX31FghJzCVK5+dE9qSvGu6nRz3wN5F/xvs/hTuFzipFBwB1C51lchdrUiZcDfSrqMkWhKcmF+axK0CKHSDo2lwxqYCcW9b1d7Ww==' >> ~/.ssh/authorized_keys # 设置文件权限(必须严格,否则 SSH 会拒绝读取) chmod 600 ~/.ssh/authorized_keys
3.3 步骤3:Xshell 配置密钥登录
- 打开 Xshell,点击 文件 > 新建,弹出“新建会话属性”窗口。
- 在“连接”选项卡中,输入“主机”(远程服务器 IP,如 192.168.10.23),“端口号”保持 22(默认 SSH 端口)。
- 切换到“用户身份验证”选项卡,“方法”选择 Public Key(公钥),“用户名”输入远程服务器的登录用户(如 root)。
- 点击“用户密钥”右侧的 浏览,选择之前生成的密钥(如“Linux-Server-Key”),若设置了密钥密码,需在“密码”栏输入。
- 点击 确定,双击会话名称发起连接,无需输入服务器密码即可成功登录。
四、关键注意事项:避坑指南
-
文件权限严格控制
SSH 对~/.ssh目录和authorized_keys文件的权限有严格要求,权限过宽会导致密钥登录失败:~/.ssh目录权限:必须为700(仅所有者可读写执行);authorized_keys文件权限:必须为600(仅所有者可读写)。
若权限错误,执行如下命令修正:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys -
私钥安全保管
客户端私钥(如 Linux 的/root/.ssh/id_rsa、Xshell 保存的密钥)是身份凭证,一旦泄露,服务器将面临安全风险:- Linux 客户端:私钥权限设为
600,避免其他用户读取; - Windows 客户端:定期备份密钥文件,避免误删。
- Linux 客户端:私钥权限设为
-
多密钥管理
若需管理多台服务器,可生成不同密钥对(如id_rsa_server1、id_rsa_server2),登录时用-i指定私钥:ssh -i /root/.ssh/id_rsa_server2 root@192.168.10.24 -
禁用密码登录(可选,增强安全)
若确认密钥登录正常,可在服务器上禁用密码登录,彻底杜绝暴力破解:# 编辑 SSH 配置文件 vim /etc/ssh/sshd_config # 修改如下参数 PasswordAuthentication no # 禁用密码登录 PubkeyAuthentication yes # 启用公钥登录 # 重启 SSH 服务生效 systemctl restart sshd
五、总结
SSH 密钥登录通过非对称加密实现了“安全+便捷”的平衡:相比密码登录,它能抵御暴力破解;相比手动输入密码,它支持免密自动化操作(如脚本批量部署)。无论是 Linux 客户端还是 Windows(Xshell)客户端,核心步骤都是“生成密钥对→上传公钥→配置登录”,只需注意文件权限和私钥安全,即可轻松实现安全的远程登录。
对于生产环境,建议结合“密钥密码+禁用密码登录+定期更换密钥”的策略,进一步提升服务器的安全性。

4710

被折叠的 条评论
为什么被折叠?



