Linux系统基础10:SSH 密钥认证配置

发布时间:2026/7/13 8:16:49
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 linuxlearnyour-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登录用户是rootssh-copy-id root192.168.1.100命令逐成分拆解成分含义ssh-copy-id命令名SSH 公钥复制工具root192.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 linuxlearnyour-pc用鼠标选中整行右键复制注意不要少字符、不要加换行。步骤 2密码登录远程服务器ssh root192.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 root192.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验证新开一个终端窗口尝试用密码登录应该会直接报错只能用密钥登录就说明加固成功了。六、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 root192.168.1.100免密进入就是成功了。七、新手高频踩坑排查1. 配置完还是要输密码90% 是权限问题这是最常见的问题SSH 对密钥相关文件的权限要求非常严格权限太松就会静默失效回退到密码登录。检查服务端权限远程服务器上执行# 查看 .ssh 目录和文件的权限 ls -ld ~/.ssh ls -l ~/.ssh/authorized_keys✅ 正确权限.ssh目录必须是drwx------700authorized_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 yes3. Windows 提示私钥权限不安全Windows 下也会校验私钥权限如果私钥文件能被其他用户读取就会报错。 解决方法找到id_ed25519文件 → 右键「属性」→「安全」→「高级」点击「禁用继承」→ 选择「将继承的权限转换为此对象的显式权限」删掉所有用户只保留你自己的账号权限给「完全控制」确定保存后再尝试登录4. 还是不行开启调试模式看原因登录时加-v参数会打印详细的调试日志能看到具体是哪一步失败了ssh -v root192.168.1.100在输出里找debug1:的提示一般能定位到是密钥没找到、权限不对、还是服务端拒绝。八、补充实用知识一对密钥可以用在多台服务器上不用每台服务器生成一对密钥把同一个公钥放到所有你要登录的设备上就行管理起来更方便。私钥一定要备份好私钥丢了就再也登不上了如果禁用了密码的话同时绝对不能泄露给别人。私钥密码短语 ssh-agent给私钥设置了密码短语又不想每次都输可以用ssh-agent缓存密码输入一次管一天。OK62xx 嵌入式设备注意如果是出厂系统一般默认开启 SSH多数是 dropbear 轻量 SSH 服务dropbear 同样支持密钥认证公钥路径也是~/.ssh/authorized_keys权限要求一致部分极度精简的系统可能需要手动开启公钥认证功能查对应开发板的手册即可。