Linux密钥登录配置教程

在 Linux 系统中,SSH 密钥登录是替代传统密码登录的更安全方式,能有效避免密码被暴力破解的风险。本文将详细介绍配置 SSH 密钥登录的完整步骤,包含服务器配置、客户端密钥生成、权限设置及常见问题排查。

一、服务器端配置:修改 SSH 配置文件

首先需要登录 Linux 服务器,通过修改 sshd_config 文件开启公钥验证功能。

1. 登录服务器并编辑配置文件

使用密码登录服务器后,执行以下命令打开 SSH 配置文件:

bash 复制代码
vi /etc/ssh/sshd_config

2. 调整关键配置项

在配置文件中找到以下 4 个配置项,取消注释(若有 # 前缀)并修改为指定值:

配置项 推荐值 配置说明
RSAAuthentication yes 开启基于 RSA 算法的安全验证(兼容传统 RSA 密钥)
PubkeyAuthentication yes 开启公钥登录验证(核心配置,必须设为 yes
AuthorizedKeyFiles .ssh/authorized_keys 指定存储客户端公钥的文件路径(默认路径,无需修改)
StrictModes no 关闭 SSH 登录前对用户家目录、rhosts 文件的权限检查(避免权限问题导致登录失败)

3. 重启 SSH 服务使配置生效

修改完成后,保存并退出 vi(按 Esc 后输入 :wq),执行以下命令重启 SSH 服务:

bash 复制代码
systemctl restart sshd.service

linux的各个发行版本,SSH服务命令略有差异, 关键区别:Ubuntu/Debian 的 SSH 服务名是 ssh,其他多数版本是 sshd,centos7是 sshd.service

二、客户端配置:生成公钥与私钥

以 macOS 客户端为例(Windows 可通过 Git Bash、PowerShell 操作,步骤一致),生成用于登录的密钥对(公钥 + 私钥)。

1. 进入客户端 .ssh 目录

打开终端,执行命令进入用户目录下的 .ssh 文件夹(若不存在会自动创建):

bash 复制代码
cd ~/.ssh

2. 生成 ed25519 密钥对

执行以下命令生成密钥,支持自定义密钥名称和关联邮箱(便于区分多台服务器密钥):

bash 复制代码
# 基础生成命令(默认密钥名为 id_ed25519)
ssh-keygen -t ed25519   # 推荐 ed25519 算法(比 RSA 更安全高效)

# 自定义密钥名称 + 关联邮箱(推荐,例如区分服务器用途)
ssh-keygen -t ed25519 -C "server_linux@example.com" -f "id_ed25519"

3. 完成密钥生成

执行命令后按提示操作:

  • 若不需要为密钥设置密码(简化登录,适合个人使用),直接按 3 次回车;
  • 若需要更高安全性(防止私钥泄露后被滥用),可输入密码并确认。

生成成功后,.ssh 目录下会出现两个文件:

  • 私钥文件(如 id_ed25519 ):保存在客户端,严禁泄露给他人
  • 公钥文件(如 id_ed25519.pub ):需上传到 Linux 服务器。

三、服务器端:添加客户端公钥并设置权限

将客户端生成的公钥上传到服务器,并配置正确的文件权限(权限错误会导致公钥登录失败,是常见坑点)。

1. 上传客户端公钥到服务器

通过 scp 命令将客户端公钥文件上传到服务器的 ~/.ssh/ 目录(以默认密钥名 id_ed25519.pub 为例):

bash 复制代码
# 格式:scp 客户端公钥路径 服务器用户名@服务器IP:服务器目标路径
scp ~/.ssh/id_ed25519.pub root@xxx.xxx.xxx.xxx:~/.ssh/

执行后输入服务器密码,完成公钥上传。

2. 合并公钥到 authorized_keys

登录服务器,进入 ~/.ssh/ 目录,将上传的公钥追加到 authorized_keys 文件(若文件不存在会自动创建):

bash 复制代码
# 进入 .ssh 目录
cd ~/.ssh/

# 追加公钥到 authorized_keys(避免覆盖已有公钥)
cat id_ed25519.pub >> authorized_keys

# 删除上传的原始公钥文件(清理冗余文件)
rm -f id_ed25519.pub

3. 配置正确的权限(关键步骤)

SSH 对目录和文件权限有严格要求,权限过宽会导致登录失败,需执行以下命令设置权限:

bash 复制代码
# 设置 .ssh 目录权限(仅所有者可读写执行,其他用户无权限)
chmod 700 ~/.ssh/

# 设置 authorized_keys 文件权限(仅所有者可读写,其他用户无权限)
chmod 644 ~/.ssh/authorized_keys

四、客户端:设置登录别名(可选,简化操作)

为避免每次登录都输入服务器 IP、用户名和端口,可在客户端 .ssh 目录下创建 config 文件,设置登录别名。

1. 创建并编辑 config 文件

bash 复制代码
vi ~/.ssh/config

2. 添加服务器配置

按以下格式添加配置(可配置多台服务器,区分别名):

bash 复制代码
# 1号服务器(自定义别名,如 linux-server)
Host linux-server
  HostName xxx.xxx.xxx.xxx  # 服务器IP地址
  User root                  # 登录用户名(如 root 或普通用户)
  Port 22                    # SSH端口(默认22,若修改过需对应调整)
  IdentityFile ~/.ssh/id_ed25519 # 客户端私钥路径(若自定义密钥名需修改)

# 2号服务器(示例:另一台服务器配置)
Host linux-test
  HostName xxx.xxx.xxx.xxx
  User testuser
  Port 2222
  IdentityFile ~/.ssh/id_ed25519_test

3. 简化登录

配置完成后,只需输入别名即可快速登录服务器:

bash 复制代码
# 登录 1号服务器(别名 linux-server)
ssh linux-server

五、常见问题排查:公钥登录失败怎么办?

若配置后无法免密登录,可通过以下步骤排查问题:

1. 查看 SSH 登录日志

服务器端日志文件 /var/log/secure 会记录登录失败原因,执行以下命令查看日志:

bash 复制代码
tail -f /var/log/secure

常见错误提示及解决方案:

  • Authentication refused: bad ownership or modes for directory /home/用户 :目录权限错误,重新执行步骤三的权限配置命令(chmod 700 ~/.ssh/chmod 644 ~/.ssh/authorized_keys)。
  • No supported authentication methods availablesshd_config 配置错误,检查 PubkeyAuthentication 是否设为 yes,并重启 SSH 服务。

2. 重新检查配置项

重点确认以下内容:

  • 服务器 sshd_configPubkeyAuthenticationyesStrictModesno
  • 客户端私钥未泄露,且 config 文件中 IdentityFile 路径正确;
  • 服务器 authorized_keys 中包含客户端公钥的完整内容(无遗漏或多余字符)。

六、总结

通过以上步骤,即可完成 Linux 服务器的 SSH 公钥登录配置,实现免密登录的同时大幅提升安全性。核心注意事项:

  1. 服务器 sshd_config 配置需正确,尤其是 PubkeyAuthentication = yesStrictModes = no
  2. 目录和文件权限必须严格设置(700 目录 + 644 文件),避免权限过宽;
  3. 客户端私钥需妥善保管,严禁泄露给未授权用户;
  4. 登录失败时,通过 /var/log/secure 日志快速定位问题。
相关推荐
小北方城市网32 分钟前
第 6 课:Vue 3 工程化与项目部署实战 —— 从本地开发到线上发布
大数据·运维·前端·ai
记得记得就1512 小时前
docker作业
运维·docker·容器
运维行者_3 小时前
OPM 与传统管理工具的区别,在网络修复与自动化运维方面的优势在哪里?
运维·服务器·开发语言·网络·自动化·php·ssl
HaSaKing_7213 小时前
EMQX 多机集群部署完整实践(Docker + 社区版 5.8.8)
运维·docker·容器·emqx
南山nash4 小时前
企业级docker镜像仓库harbor安装与使用
运维·docker·容器·镜像仓库
云和数据.ChenGuang5 小时前
Logstash配置文件的**语法解析错误**
运维·数据库·分布式·rabbitmq·jenkins
飞飞传输5 小时前
守护医疗隐私,数据安全摆渡系统撑起内外网安全伞!
大数据·运维·安全
Guheyunyi5 小时前
视频安全监测系统的三大核心突破
大数据·运维·服务器·人工智能·安全·音视频
Jelly-小丑鱼5 小时前
Linux搭建SQLserver数据库和Orical数据库
linux·运维·数据库·sqlserver·oracal·docker容器数据库
Run_Teenage5 小时前
Linux:进程等待
linux·运维·服务器