场景
- 客户端:Win10(自带 OpenSSH)、或任一 Linux 桌面
- 目标设备:Debian / Ubuntu(新)、CentOS 7(老)、OpenWrt(dropbear)
- 目标:从客户端免密
ssh/scp到目标设备
密钥类型和长度怎么选
ssh-keygen -t <type> 支持的算法与推荐:
| 类型 | 现状 | 建议 |
|---|---|---|
ed25519 | 现代首选,密钥小、速度快、安全性高 | 默认用这个 |
rsa | 兼容性最好,老设备必要时用 | 必须 -b 4096,不要再用 2048 |
ecdsa | NIST 曲线,坊间对其随机数实现存疑 | 不推荐 |
dsa | 已废弃,OpenSSH 7.x 起逐步禁用 | 不要用 |
一句话:能用 ed25519 就用 ed25519;老设备不认就退回 rsa -b 4096。
各目标设备的兼容性:
- Debian / Ubuntu(任何仍在维护的版本):
ed25519没问题。 - CentOS 7(OpenSSH 7.4):
ed25519支持,直接用。 - OpenWrt(dropbear 2020.79+,即 OpenWrt 19.07 之后):
ed25519支持。再老的固件(15.x / 18.06)只认rsa,这时生成-t rsa -b 2048(dropbear 在极老硬件上处理 4096 位会慢、甚至内存不足)。
生成命令:
| |
-C是注释,加上日期方便以后在authorized_keys里一眼认出是哪台机器哪年的 key。- 一路回车;passphrase 留空方便自动化,想更安全就设置一个,然后配合
ssh-agent免每次输入。 - 默认路径:Linux 在
~/.ssh/,Win10 在C:\Users\<用户>\.ssh\。 - 文件命名:
id_ed25519/id_ed25519.pub,或id_rsa/id_rsa.pub。
客户端:生成密钥
Linux 客户端
| |
Win10 客户端(自带 OpenSSH)
Win10 1809+ 原生自带 OpenSSH,PowerShell 里直接:
| |
如果提示找不到命令,控制面板 → 应用 → 可选功能 → 添加 “OpenSSH 客户端”。密钥会生成在 C:\Users\<用户>\.ssh\。
目标设备:部署公钥
通用快捷方式(Linux 客户端首选)
| |
会自动处理 ~/.ssh 目录、权限、追加到 authorized_keys。
Win10 没有 ssh-copy-id,用 PowerShell 一行搞定:
| |
Debian / Ubuntu / CentOS 7(标准 OpenSSH)
手动部署就是把公钥内容追加到目标机的 ~/.ssh/authorized_keys:
| |
CentOS 7 额外一步(SELinux):如果是 scp 拷过去的文件,SELinux context 可能不对,导致 sshd 无法读:
| |
OpenWrt(dropbear,不是 OpenSSH)
OpenWrt 默认用 dropbear,密钥文件和普通 Linux 不一样:
- 所有用户(其实只有 root)的公钥都写到
/etc/dropbear/authorized_keys(单文件,不分用户) - 文件权限必须
0600,目录0700
| |
或者本地一行推过去:
| |
想禁止密码登录(仅限 LAN 内安全时这么干):
| |
权限要求(90% 的免密失败都栽这儿)
目标机必须满足:
| 路径 | 权限 | 属主 |
|---|---|---|
~ | 不能对 group/other 可写 | 当前用户 |
~/.ssh | 700 | 当前用户 |
~/.ssh/authorized_keys | 600 | 当前用户 |
一行体检:
| |
~/.ssh/config 进阶(强烈推荐配一次)
客户端写 ~/.ssh/config,以后只用 alias,省敲:
| |
之后 ssh myvps / scp file myvps:/tmp/ 即可;rsync、git over ssh 也都能用。
Win10 下同样,文件路径 C:\Users\<用户>\.ssh\config。
故障排查速查
连上去还是要密码? 按这个顺序查:
- 本地 key 是否被加载:
ssh -v user@host 2>&1 | grep -i offering - 目标机
/var/log/auth.log(Debian/Ubuntu)或/var/log/secure(CentOS);OpenWrt 看logread | grep dropbear - 目标机
~/.ssh和~/.ssh/authorized_keys权限(见上表) - CentOS 7 试一下
restorecon -R -v ~/.ssh /etc/ssh/sshd_config里PubkeyAuthentication yes、PermitRootLogin别设成no- OpenWrt 确认公钥在
/etc/dropbear/authorized_keys(不是~/.ssh/!)
指定某个 key 登录(多 key 环境调试用):
| |