Linux系统基础10:SSH 密钥认证配置
Linux SSH 密钥认证配置 新手超详细教程
目录
Linux SSH 密钥认证配置 新手超详细教程
一、先搞懂:密钥认证是什么?为什么比密码好?
1. 核心原理:一对钥匙,一把锁一把钥匙
2. 对比密码登录的优势
3. 准备工作
二、步骤 1:在本地客户端生成密钥对
推荐算法:ed25519
执行生成命令
命令逐成分拆解
交互过程详解(新手一路回车即可)
第 1 步:选择密钥保存路径
第 2 步:设置私钥密码短语(可选)
第 3 步:确认密码短语
生成完成的结果
三、步骤 2:把公钥上传到远程服务器
方法一:ssh-copy-id 一键上传(推荐,最简单)
命令格式
真实举例(对应 OK62xx 开发板场景)
命令逐成分拆解
执行过程
方法二:手动上传公钥(ssh-copy-id 不可用时用)
步骤 1:先查看并复制你的公钥内容
步骤 2:密码登录远程服务器
步骤 3:在远程服务器创建 .ssh 目录(如果没有)
步骤 4:把公钥写入 authorized_keys 文件
步骤 5:设置正确的权限(非常重要!)
四、步骤 3:验证免密登录是否成功
五、步骤 4:安全加固:禁用密码登录(可选但强烈推荐)
操作步骤
六、Windows 原生 PowerShell 配置方法
1. 生成密钥
2. 上传公钥
3. 验证登录
七、新手高频踩坑排查
1. 配置完还是要输密码?90% 是权限问题
检查服务端权限(远程服务器上执行)
检查客户端权限(本地上执行)
2. 报错 Permission denied (publickey)
3. Windows 提示私钥权限不安全
4. 还是不行?开启调试模式看原因
八、补充实用知识
SSH 密钥认证是比密码登录更安全、更方便的远程登录方式,也是嵌入式开发、服务器运维的必备技能。它基于非对称加密实现,全程不需要传输密码,既能防暴力破解,又能实现免密登录,非常适合日常管理 OK62xx 开发板、云服务器等 Linux 设备。
我会从原理→生成密钥→上传公钥→验证登录→安全加固→踩坑排查一步步拆解,每个命令都逐成分说明,零基础也能跟着操作。
一、先搞懂:密钥认证是什么?为什么比密码好?
1. 核心原理:一对钥匙,一把锁一把钥匙
SSH 密钥认证会生成一对匹配的密钥:
- 公钥(Public Key):相当于「锁」,可以公开,放到你要登录的远程服务器上。
- 私钥(Private Key):相当于「钥匙」,必须你自己保管,绝对不能泄露,存在你的本地电脑上。
登录时的完整流程:
- 你发起登录请求,服务器用公钥加密一段随机数据,发给你。
- 你的本地电脑用私钥解密这段数据,再发回给服务器。
- 服务器验证解密结果正确,就确认你是合法用户,直接放行登录。
全程不会传输密码,就算网络被监听,也拿不到你的登录凭证,安全性远高于密码登录。
2. 对比密码登录的优势
- ✅更安全:防暴力破解,没有密码可以被猜
- ✅更方便:配置好后不用每次输密码,远程操作效率高
- ✅适合自动化:脚本、程序自动登录服务器,不需要硬编码密码
3. 准备工作
- 客户端:你的本地 Linux/WSL/Windows 终端(用来发起登录)
- 服务端:远程 Linux 设备(OK62xx 开发板、云服务器等),已开启 SSH 服务
- 你需要知道:远程设备的IP 地址、登录用户名、当前的登录密码
- 确保网络连通:本地能 ping 通远程设备,能正常用密码 SSH 登录
二、步骤 1:在本地客户端生成密钥对
首先在你自己的电脑(客户端)上生成公钥 + 私钥,只需要生成一次,同一对密钥可以给多台服务器用。
推荐算法:ed25519
现在主流推荐用ed25519算法,比传统的 RSA 更安全、体积更小、速度更快;如果是非常老的嵌入式系统不支持 ed25519,再用 RSA。
执行生成命令
打开你的本地终端(WSL/Linux 终端 / Windows PowerShell 都可以),输入:
ssh-keygen -t ed25519命令逐成分拆解
| 成分 | 含义 | 为什么这么用 |
|---|---|---|
ssh-keygen | 命令名,SSH 密钥生成工具 | 专门用来生成 SSH 密钥对的官方工具 |
-t ed25519 | 选项,指定密钥类型 | -t= type,指定用 ed25519 加密算法 |
交互过程详解(新手一路回车即可)
执行命令后,会有三步提示,新手直接按三次回车就行,下面解释每个提示是什么:
第 1 步:选择密钥保存路径
Generating public/private ed25519 key pair. Enter file in which to save the key (/home/你的用户名/.ssh/id_ed25519):- 默认保存在用户家目录的
.ssh文件夹里:~/.ssh/id_ed25519 - 新手直接回车,用默认路径就行,改了路径后面登录还要手动指定,容易忘。
第 2 步:设置私钥密码短语(可选)
Enter passphrase (empty for no passphrase):- 这是给私钥本身加一层密码保护:就算别人拿到了你的私钥文件,不知道这个短语也用不了。
- 新手练习可以直接回车(不设置),日常使用更方便;生产环境强烈建议设置。
- 注意:这个密码不是服务器的登录密码,是保护你本地私钥的。
第 3 步:确认密码短语
Enter same passphrase again:- 和上一步输入一样的内容,没设置就直接回车。
生成完成的结果
看到类似下面的输出,就代表生成成功了:
Your identification has been saved in /home/linuxlearn/.ssh/id_ed25519 Your public key has been saved in /home/linuxlearn/.ssh/id_ed25519.pub The key fingerprint is: SHA256:xxxxxxxxxx linuxlearn@your-pc生成的两个文件非常重要:
~/.ssh/id_ed25519:私钥文件,绝对不能发给别人、不能上传到公开地方,相当于你的家门钥匙。~/.ssh/id_ed25519.pub:公钥文件,可以随便分发,相当于锁,要放到远程服务器上。
补充:如果要用传统 RSA 算法(兼容老系统),命令是:
bash
运行
ssh-keygen -t rsa -b 4096
-b 4096表示密钥长度 4096 位,安全性更高。
三、步骤 2:把公钥上传到远程服务器
生成密钥后,要把「公钥」放到远程服务器的指定位置,服务器才能用它来验证你的身份。有两种方法,新手优先用第一种。
方法一:ssh-copy-id一键上传(推荐,最简单)
绝大多数 Linux 发行版(包括 Ubuntu、Debian、OK62xx 标准系统)都自带这个命令,一行命令自动完成所有配置,不会出错。
命令格式
ssh-copy-id 远程用户名@远程服务器IP真实举例(对应 OK62xx 开发板场景)
假设你的开发板 IP 是192.168.1.100,登录用户是root:
ssh-copy-id root@192.168.1.100命令逐成分拆解
| 成分 | 含义 |
|---|---|
ssh-copy-id | 命令名,SSH 公钥复制工具 |
root@192.168.1.100 | 目标服务器信息,格式是「用户名 @IP 地址」 |
执行过程
- 第一次连接会提示:
Are you sure you want to continue connecting (yes/no/[fingerprint])?- 输入
yes回车,确认信任这台服务器。
- 输入
- 然后会提示输入远程服务器的登录密码(就是你平时密码登录的密码)。
- 输入密码回车后,工具会自动:
- 在远程服务器上创建
~/.ssh目录(如果不存在) - 把你的公钥追加到远程服务器的
~/.ssh/authorized_keys文件里 - 自动设置好正确的权限
- 在远程服务器上创建
看到Number of key(s) added: 1就代表上传成功了。
方法二:手动上传公钥(ssh-copy-id 不可用时用)
如果嵌入式设备精简系统没有ssh-copy-id命令(比如部分 BusyBox 系统),可以手动操作,原理和一键上传完全一样。
步骤 1:先查看并复制你的公钥内容
在本地终端执行,打印公钥内容:
cat ~/.ssh/id_ed25519.pub输出是一长串字符,大概长这样:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBxxxxxxxxxxxxxx linuxlearn@your-pc- 用鼠标选中整行,右键复制,注意不要少字符、不要加换行。
步骤 2:密码登录远程服务器
ssh root@192.168.1.100输入密码登录进去。
步骤 3:在远程服务器创建 .ssh 目录(如果没有)
mkdir -p ~/.ssh- 拆解:
-p确保目录存在就不报错,不存在就创建。
步骤 4:把公钥写入 authorized_keys 文件
echo "你刚才复制的公钥整行内容" >> ~/.ssh/authorized_keys- 拆解:
>>是追加写入,不会覆盖原有内容;如果已经有其他公钥,会加在后面。 - 新手注意:公钥是一整行,不要拆成多行,引号里粘贴完整内容。
步骤 5:设置正确的权限(非常重要!)
SSH 有严格的安全机制,如果文件 / 目录权限太宽松,会直接拒绝密钥认证,这是新手最高频的踩坑点。
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys- 逐行说明:
chmod 700 ~/.ssh:.ssh 目录只有所有者能读写进入,其他人完全没权限chmod 600 ~/.ssh/authorized_keys:公钥文件只有所有者能读写,其他人完全没权限
四、步骤 3:验证免密登录是否成功
回到本地终端,直接执行 SSH 登录命令:
ssh root@192.168.1.100✅ 成功标志: 不需要输入密码,直接就进入了远程服务器的终端,说明密钥认证配置成功了。
❌ 如果还是提示要输密码,说明配置有问题,直接翻到后面的「常见问题排查」部分。
五、步骤 4:安全加固:禁用密码登录(可选但强烈推荐)
确认密钥登录完全正常后,建议关闭密码登录,彻底杜绝暴力破解的风险。
⚠️ 重要警告:必须确保密钥登录能正常使用再操作!如果密钥有问题,关掉密码登录后你自己就登不上服务器了,只能通过串口 / 控制台恢复。
操作步骤
登录远程服务器,编辑 SSH 服务配置文件:
sudo nano /etc/ssh/sshd_config嵌入式设备如果是 dropbear 服务,配置文件路径不同,一般不用额外改,默认就支持密钥;OpenSSH 才是这个路径。
找到下面几个配置项,修改成对应的值(前面有
#注释的就去掉注释,没有就新增):# 禁用密码登录 PasswordAuthentication no # 禁止空密码登录 PermitEmptyPasswords no # 允许密钥认证(默认一般是yes,确认一下) PubkeyAuthentication yes保存退出:按
Ctrl + O回车保存,Ctrl + X退出 nano。重启 SSH 服务,让配置生效:
- Ubuntu/Debian 系统:
sudo systemctl restart sshd - 嵌入式老系统 /init 系统:
sudo service sshd restart
- Ubuntu/Debian 系统:
验证:新开一个终端窗口,尝试用密码登录,应该会直接报错,只能用密钥登录,就说明加固成功了。
六、Windows 原生 PowerShell 配置方法
如果你不用 WSL,直接用 Windows 自带的终端也能配置,Windows 10/11 已经自带 OpenSSH 客户端,不用额外装软件。
1. 生成密钥
打开 PowerShell,输入和 Linux 完全一样的命令:
ssh-keygen -t ed25519- 一路回车,默认保存在
C:\Users\你的Windows用户名\.ssh\目录下 - 同样生成
id_ed25519(私钥)和id_ed25519.pub(公钥)两个文件
2. 上传公钥
Windows 没有ssh-copy-id命令,用手动方法:
- 查看公钥内容:
type .ssh\id_ed25519.pub - 复制整行内容,密码登录远程服务器,写入
~/.ssh/authorized_keys,设置权限,和前面手动方法完全一致。
3. 验证登录
ssh root@192.168.1.100免密进入就是成功了。
七、新手高频踩坑排查
1. 配置完还是要输密码?90% 是权限问题
这是最常见的问题,SSH 对密钥相关文件的权限要求非常严格,权限太松就会静默失效,回退到密码登录。
检查服务端权限(远程服务器上执行)
# 查看 .ssh 目录和文件的权限 ls -ld ~/.ssh ls -l ~/.ssh/authorized_keys✅ 正确权限:
.ssh目录:必须是drwx------(700)authorized_keys文件:必须是-rw-------(600)
❌ 如果权限不对,执行修复命令:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys检查客户端权限(本地上执行)
本地的私钥文件权限也不能太松,尤其是 Linux/WSL 环境:
chmod 600 ~/.ssh/id_ed255192. 报错Permission denied (publickey)
- 先检查上面的权限问题
- 确认公钥有没有写错:是不是完整的一行、有没有多复制空格、有没有少字符
- 确认用户名对不对:公钥是放到哪个用户的目录下,就只能用哪个用户登录
- 比如你放到了 root 的目录下,就只能用 root 登录;用普通用户登录是没用的
- 确认服务器开启了密钥认证:检查
sshd_config里PubkeyAuthentication yes
3. Windows 提示私钥权限不安全
Windows 下也会校验私钥权限,如果私钥文件能被其他用户读取,就会报错。 解决方法:
- 找到
id_ed25519文件 → 右键「属性」→「安全」→「高级」 - 点击「禁用继承」→ 选择「将继承的权限转换为此对象的显式权限」
- 删掉所有用户,只保留你自己的账号,权限给「完全控制」
- 确定保存后再尝试登录
4. 还是不行?开启调试模式看原因
登录时加-v参数,会打印详细的调试日志,能看到具体是哪一步失败了:
ssh -v root@192.168.1.100在输出里找debug1:的提示,一般能定位到是密钥没找到、权限不对、还是服务端拒绝。
八、补充实用知识
- 一对密钥可以用在多台服务器上:不用每台服务器生成一对密钥,把同一个公钥放到所有你要登录的设备上就行,管理起来更方便。
- 私钥一定要备份好:私钥丢了就再也登不上了(如果禁用了密码的话);同时绝对不能泄露给别人。
- 私钥密码短语 + ssh-agent:给私钥设置了密码短语,又不想每次都输,可以用
ssh-agent缓存密码,输入一次管一天。 - OK62xx 嵌入式设备注意:
- 如果是出厂系统,一般默认开启 SSH(多数是 dropbear 轻量 SSH 服务)
- dropbear 同样支持密钥认证,公钥路径也是
~/.ssh/authorized_keys,权限要求一致 - 部分极度精简的系统可能需要手动开启公钥认证功能,查对应开发板的手册即可。
