Linux SSH密钥登录

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 密钥登录的协商交互流程

整个登录过程由服务器主导验证,核心是“用公钥加密随机数,私钥解密验证”,具体步骤如下:

  1. 客户端发起请求:客户端(如 ssh root@192.168.66.20)向服务器发送登录请求,声明“使用密钥认证”。
  2. 服务器读取公钥:服务器检查目标用户(如 root)的 ~/.ssh/authorized_keys 文件,提取对应的公钥(若未找到,自动 fallback 到密码登录)。
  3. 服务器加密随机数:服务器生成一串随机数,用提取的公钥加密,将密文发送给客户端。
  4. 客户端解密验证:客户端用本地私钥(默认 /root/.ssh/id_rsa,或 -i 指定路径)解密密文,得到随机数原文。
  5. 客户端回传原文:客户端将解密后的随机数发送给服务器,证明“我拥有对应的私钥”。
  6. 服务器比对确认:服务器将客户端回传的随机数与自己最初生成的随机数比对,一致则认证成功,允许登录;不一致则认证失败,继续尝试密码登录。

简单来说:“公钥锁门,私钥开门”——只有持有对应私钥的客户端,才能解开服务器用公钥“锁”住的随机数,从而证明身份。

二、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 中生成密钥对

  1. 打开 Xshell,点击顶部菜单栏 工具 > 用户密钥管理者,弹出“用户密钥管理者”窗口。
  2. 点击窗口右侧 生成 按钮,启动“密钥创建向导”。
  3. 选择密钥算法(默认 RSA,密钥长度建议保持 2048 位或更高),点击 下一步
  4. Xshell 自动生成密钥对(过程需几秒),生成完成后点击 下一步
  5. (可选)设置“密钥加密密码”(若为空则免密登录,生产环境建议设置密码增强安全性),点击 下一步
  6. 为密钥命名(如“Linux-Server-Key”),点击 完成,密钥对会保存到 Xshell 的密钥列表中。

3.2 步骤2:复制公钥到远程服务器

  1. 在“用户密钥管理者”中,选中刚生成的密钥,点击 属性,在“公钥”选项卡中复制完整的公钥文本(以 ssh-rsa 开头,以用户名结尾)。
  2. 登录远程 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 配置密钥登录

  1. 打开 Xshell,点击 文件 > 新建,弹出“新建会话属性”窗口。
  2. 在“连接”选项卡中,输入“主机”(远程服务器 IP,如 192.168.10.23),“端口号”保持 22(默认 SSH 端口)。
  3. 切换到“用户身份验证”选项卡,“方法”选择 Public Key(公钥),“用户名”输入远程服务器的登录用户(如 root)。
  4. 点击“用户密钥”右侧的 浏览,选择之前生成的密钥(如“Linux-Server-Key”),若设置了密钥密码,需在“密码”栏输入。
  5. 点击 确定,双击会话名称发起连接,无需输入服务器密码即可成功登录。

四、关键注意事项:避坑指南

  1. 文件权限严格控制
    SSH 对 ~/.ssh 目录和 authorized_keys 文件的权限有严格要求,权限过宽会导致密钥登录失败:

    • ~/.ssh 目录权限:必须为 700(仅所有者可读写执行);
    • authorized_keys 文件权限:必须为 600(仅所有者可读写)。
      若权限错误,执行如下命令修正:
    chmod 700 ~/.ssh
    chmod 600 ~/.ssh/authorized_keys
    
  2. 私钥安全保管
    客户端私钥(如 Linux 的 /root/.ssh/id_rsa、Xshell 保存的密钥)是身份凭证,一旦泄露,服务器将面临安全风险:

    • Linux 客户端:私钥权限设为 600,避免其他用户读取;
    • Windows 客户端:定期备份密钥文件,避免误删。
  3. 多密钥管理
    若需管理多台服务器,可生成不同密钥对(如 id_rsa_server1id_rsa_server2),登录时用 -i 指定私钥:

    ssh -i /root/.ssh/id_rsa_server2 root@192.168.10.24
    
  4. 禁用密码登录(可选,增强安全)
    若确认密钥登录正常,可在服务器上禁用密码登录,彻底杜绝暴力破解:

    # 编辑 SSH 配置文件
    vim /etc/ssh/sshd_config
    
    # 修改如下参数
    PasswordAuthentication no  # 禁用密码登录
    PubkeyAuthentication yes   # 启用公钥登录
    
    # 重启 SSH 服务生效
    systemctl restart sshd
    

五、总结

SSH 密钥登录通过非对称加密实现了“安全+便捷”的平衡:相比密码登录,它能抵御暴力破解;相比手动输入密码,它支持免密自动化操作(如脚本批量部署)。无论是 Linux 客户端还是 Windows(Xshell)客户端,核心步骤都是“生成密钥对→上传公钥→配置登录”,只需注意文件权限和私钥安全,即可轻松实现安全的远程登录。

对于生产环境,建议结合“密钥密码+禁用密码登录+定期更换密钥”的策略,进一步提升服务器的安全性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值