在 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 available:sshd_config配置错误,检查PubkeyAuthentication是否设为yes,并重启 SSH 服务。
2. 重新检查配置项
重点确认以下内容:
- 服务器
sshd_config中PubkeyAuthentication为yes、StrictModes为no; - 客户端私钥未泄露,且
config文件中IdentityFile路径正确; - 服务器
authorized_keys中包含客户端公钥的完整内容(无遗漏或多余字符)。
六、总结
通过以上步骤,即可完成 Linux 服务器的 SSH 公钥登录配置,实现免密登录的同时大幅提升安全性。核心注意事项:
- 服务器
sshd_config配置需正确,尤其是PubkeyAuthentication = yes和StrictModes = no; - 目录和文件权限必须严格设置(
700目录 +644文件),避免权限过宽; - 客户端私钥需妥善保管,严禁泄露给未授权用户;
- 登录失败时,通过
/var/log/secure日志快速定位问题。