基于Linux实现SSH密钥免密登录完整实战教程(CentOS/Ubuntu通用)

一、前言

在日常Linux服务器运维工作中,我们经常需要远程连接多台云服务器、物理服务器。如果每次登录都手动输入账号密码,不仅操作繁琐、运维效率极低,还存在极大的安全隐患。

传统密码登录采用明文传输,容易被抓包窃取,同时服务器会面临暴力破解、密码泄露等安全风险。而SSH密钥免密登录基于非对称加密技术实现身份校验,无需传输密码,是目前企业运维、自动化运维的标准配置方案。

本文从零开始,完整讲解SSH密钥免密登录的加密原理、环境准备、两种配置方法、高频报错排查、生产级安全优化,覆盖Windows、Linux多客户端场景,新手零基础也能一次配置成功。

二、SSH密钥登录底层原理

2.1 非对称加密核心机制

SSH密钥登录依托非对称加密算法,生成一对密钥:私钥公钥,二者成对存在、一一对应,无法互相推导。

  • 私钥(id_rsa):存放于本地客户端,属于最高机密文件,绝对不能外泄、不能随意传输,权限必须严格管控;

  • 公钥(id_rsa.pub):可公开分发,上传并存储在目标Linux服务器中。

登录校验流程:客户端发起SSH连接 → 服务器用公钥生成随机加密串 → 客户端用本地私钥解密校验 → 校验通过直接免密登录,全程无密码参与。

复制代码
graph LR
A[本地客户端]-->|发起SSH连接|B[远端Linux服务器]
B-->|公钥加密随机字符串|A
A-->|私钥解密回传校验结果|B
B-->|校验成功 免密登录|C[登录完成]

2.2 适用业务场景

SSH免密登录并非单纯方便运维,更是生产环境的安全刚需,核心适用场景如下:

  1. 批量运维多台服务器,远程批量执行Shell脚本、文件传输操作;

  2. 自动化运维场景:Jenkins持续集成、定时任务、远程部署项目;

  3. 生产环境关闭密码登录,彻底规避服务器暴力破解漏洞;

  4. 本地开发机远程连接测试、生产服务器,提升开发运维效率。

三、环境准备与前置检查

3.1 实验环境说明

  • 本地客户端:Windows11(自带OpenSSH)、CentOS7

  • 远程服务端:CentOS7.9 虚拟机,测试IP:192.168.122.100

  • 登录用户:root超级管理员

  • 系统依赖:openssh-server、openssh-clients(主流Linux默认预装)

3.2 检查SSH服务运行状态

所有Linux服务器默认搭载SSH服务,首先检查服务是否正常运行,避免因服务未启动导致连接失败。登录目标服务器,执行以下命令:

复制代码
# 查看ssh服务运行状态
systemctl status sshd

若输出active (running) 说明服务正常运行。若服务未启动、未开机自启,执行以下命令配置:

复制代码
# 启动ssh服务
systemctl start sshd
# 设置开机自启,服务器重启后自动生效
systemctl enable sshd

四、客户端生成SSH密钥对

4.1 生成高安全4096位RSA密钥

为了保障密钥安全性,我们不使用默认2048位密钥,直接生成4096位高强度RSA密钥。本地Windows/Linux终端执行以下命令:

复制代码
ssh-keygen -t rsa -b 4096 -C "admin@local-linux"

参数详细解析

  • -t rsa:指定加密算法为RSA非对称加密算法;

  • -b 4096:设置密钥长度为4096位,大幅提升破解难度,适配生产环境安全标准;

  • -C:添加密钥备注,方便区分多台服务器的多套密钥。

执行命令后,连续三次回车:默认密钥存储路径、不修改文件名、不设置私钥密码,快速完成密钥生成。

4.2 密钥文件详解

密钥生成后,默认存储在当前用户的 ~/.ssh/ 隐藏目录中,执行命令查看文件:

复制代码
ls -l ~/.ssh/

目录下核心两个文件:

  • id_rsa(私钥):核心机密文件,权限必须为600,禁止外泄、禁止随意分享;

  • id_rsa.pub(公钥):公开文件,需要上传至目标服务器完成免密配置。

五、公钥上传服务器(两种实战方案)

5.1 方案一:ssh-copy-id一键推送(Linux首选)

Linux客户端自带 ssh-copy-id 工具,可一键自动推送公钥、创建目录、配置权限,是最简单高效的配置方式。

复制代码
# 推送公钥至目标服务器root用户
ssh-copy-id root@192.168.122.100

执行后输入一次服务器登录密码,工具会自动将公钥写入服务器 /root/.ssh/authorized_keys 文件。

5.2 方案二:手动配置公钥(Windows客户端专用)

Windows自带的OpenSSH没有 ssh-copy-id 工具,需要手动复制公钥、配置服务器文件权限,步骤如下:

第一步:本地查看并复制完整公钥内容

复制代码
cat ~/.ssh/id_rsa.pub

第二步:远程登录服务器,手动创建目录、写入公钥、配置权限

复制代码
# 创建.ssh隐藏目录(不存在则创建)
mkdir -p /root/.ssh
# 设置目录权限为700
chmod 700 /root/.ssh
# 粘贴公钥内容至授权文件
echo "你的完整公钥字符串" >> /root/.ssh/authorized_keys
# 核心权限配置,免密生效关键
chmod 600 /root/.ssh/authorized_keys
chown root:root -R ~/.ssh

重点提醒:SSH服务对权限极其严格,目录或文件权限过大,会直接导致免密登录失效。

六、免密登录功能验证

配置完成后,无需重启服务器,直接在本地终端执行登录命令测试:

复制代码
ssh root@192.168.122.100

执行命令后,无需输入任何密码,直接进入服务器终端,代表免密登录配置完全成功。

七、高频报错排查(踩坑总结,高分核心)

很多新手配置完免密依旧失败,90%的问题集中在权限、配置参数两个维度,下面是全网最高频的报错解决方案。

7.1 报错:Permission denied (publickey)

故障根因:.ssh目录、authorized_keys文件权限过高,SSH安全机制拦截密钥登录请求。

一键修复命令

复制代码
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chown root:root -R ~/.ssh

7.2 配置完成依旧提示输入密码

故障根因:服务器SSH配置文件未开启公钥认证功能。

排查修复步骤

第一步:编辑SSH核心配置文件

复制代码
vim /etc/ssh/sshd_config

第二步:确保以下两个参数开启(取消注释、设置为yes)

复制代码
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

第三步:重启SSH服务使配置生效

复制代码
systemctl restart sshd

八、生产级安全进阶优化

基础免密配置仅适用于测试环境,生产服务器必须做好安全加固,避免私钥泄露导致服务器沦陷。

8.1 关闭密码登录(核心安全配置)

生产环境配置完密钥登录后,直接关闭服务器密码登录功能,彻底杜绝暴力破解风险。修改sshd_config 文件:

复制代码
PasswordAuthentication no

修改后重启sshd服务,服务器仅支持密钥登录,安全性大幅提升。

8.2 私钥加密保护

生成密钥时设置私钥解锁密码,即使私钥文件泄露,他人也无法直接登录服务器,双重保障安全。

8.3 多服务器密钥隔离

一台客户端管理多台服务器时,可通过 -f 参数自定义密钥文件名,实现多套密钥独立管理,避免密钥混淆。

九、全文总结

SSH密钥免密登录是Linux运维、自动化开发的入门核心技能,区别于传统密码登录,非对称加密的登录方式兼具高效性和安全性。

本文完整覆盖原理讲解、环境部署、双场景配置、报错排坑、安全优化全流程,解决了新手配置免密登录失败、不懂原理、不会优化的痛点。熟练掌握该配置,可极大提升多服务器运维效率,同时筑牢服务器基础安全防线。

相关推荐
Web3探索者2 天前
可视化服务器管理和传统命令行区别是什么?新手教程:Linux 运维到底该用图形界面还是 SSH 命令行?
linux·ssh
zylyehuo2 天前
Linux系统中网线与USB网络共享冲突
linux
Sokach10153 天前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
AlfredZhao4 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3105 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode5 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
A小辣椒7 天前
TShark:Wireshark CLI 功能
linux
A小辣椒7 天前
TShark:基础知识
linux
AlfredZhao7 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao8 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi