SSH密钥对通过数学运算单向生成:私钥可推导公钥,反之不可逆;ed25519因更短、更快、更安全且抗侧信道攻击而被默认推荐;生成时路径、密码短语和注释需谨慎设置;服务端权限(700/600)与配置是免密登录失败主因。

SSH密钥对到底怎么“配对”的?
私钥和公钥不是两个独立生成的密码,而是数学上强绑定的一对:用私钥能算出公钥,但反过来绝对不行。你本地的 id_ed25519 文件里存的是随机数(私钥),OpenSSH 用它在 Ed25519 曲线上做一次运算,就得到对应的公钥内容,写进 id_ed25519.pub。服务器只认这个公钥字符串——它不关心你本地有没有、是不是同一台机器生成的,只要签名能被它验证通过,就放行。
所以别试图“改公钥”来绕过权限检查,也别把私钥当成普通文本随意复制粘贴;一旦私钥文件被读取(比如权限设成 644),OpenSSH 会直接拒绝使用,报错:Permissions for 'id_ed25519' are too open。
为什么现在默认推荐 ed25519 而不是 rsa?
不是因为 RSA 不安全,而是 ed25519 在同等安全强度下更轻、更快、更省心:
-
ed25519私钥固定 256 位,签名速度比 4096 位 RSA 快 5–10 倍,git push或频繁连接跳板机时延迟感知明显 - 公钥只有 64 字节,
authorized_keys文件更干净,复制粘贴不易出错 - OpenSSH 6.5+(2013 年起)已原生支持,现代 Linux 发行版、GitHub、GitLab、阿里云 ECS 全部兼容
- 不依赖大整数模幂运算,对侧信道攻击(如时序攻击)天然免疫
唯一例外是极老旧系统(如 CentOS 6 或某些嵌入式 SSH 服务端),若连接时报错 no mutual signature algorithm,才需降级用 ssh-keygen -t rsa -b 4096。
ssh-keygen -t ed25519 执行时哪些选项不能跳过?
命令本身极简,但三个交互点决定后续是否踩坑:
- 保存路径:直接回车用默认
C:\Users\用户名\.ssh\id_ed25519(Windows)或/home/user/.ssh/id_ed25519(Linux/macOS)。自定义路径虽可行,但后续所有工具(ssh、git、rsync)都得显式指定-i参数,容易漏 - Passphrase:回车即空密码——实现“真免密”,但私钥文件一旦泄露即失守;设密码则每次连接要输一次,可用
ssh-agent缓存,兼顾安全与便利 - 注释(
-C参数):建议填邮箱,如"me@work.com"。它不参与加密,只写在公钥末尾,方便你在authorized_keys里一眼识别来源
公钥传到服务器后连不上?先查这三件事
免密失败十次里,九次是服务端权限或配置问题,和密钥本身无关:
-
~/.ssh目录权限必须是700,否则 OpenSSH 拒绝读取authorized_keys;chmod 700 ~/.ssh是铁律 -
~/.ssh/authorized_keys文件权限必须是600;chmod 600 ~/.ssh/authorized_keys同样不可省 - 确认服务端
/etc/ssh/sshd_config中PubkeyAuthentication yes和AuthorizedKeysFile .ssh/authorized_keys已启用(多数现代系统默认开)
如果仍失败,用 ssh -v user@host 看详细日志,重点关注 debug1: Offering public key 和 debug1: Server accepts key 是否出现——没走到第二句,基本就是公钥没传对或路径不对。
最常被忽略的一点:Windows 用户用 PowerShell 复制公钥时,clip 可能带隐藏换行或空格;宁可手动 cat ~/.ssh/id_ed25519.pub 再全选复制,也不要依赖自动剪贴板。










