openssh 8.8+ 默认禁用不安全的 ssh-rsa(sha-1),应使用 ssh-keygen -t ed25519 生成密钥;私钥权限须为600、目录700;公钥需正确部署至 remote authorized_keys(权限600);多密钥时应在 ~/.ssh/config 中显式指定 identityfile。

ssh-keygen 默认生成的密钥类型不安全
OpenSSH 8.8+ 已默认禁用 ssh-rsa(即 SHA-1 签名),如果你用老教程跑 ssh-keygen 不加参数,很可能生成一个被新版本服务端拒绝的密钥。不是“没生效”,而是连接时直接报错:no mutual signature algorithm 或 key type ssh-rsa not supported。
实操建议:
- 明确指定现代算法:优先用
ssh-keygen -t ed25519 -C "your_email@example.com" - 若需兼容极老系统(如 CentOS 6、某些嵌入式设备),改用
ssh-keygen -t rsa -b 4096,但别用-b 2048—— OpenSSH 9.0+ 已警告 2048 位 RSA 弱于当前标准 -
-C后的邮箱只是注释,不参与认证,可写任意标识(比如"prod-server-2024")
私钥权限不对会导致 SSH 拒绝加载
OpenSSH 对私钥文件权限极其敏感。哪怕只是多了一个组可读位,ssh 就会静默忽略该密钥,并 fallback 到密码登录(如果允许)或直接失败。常见现象是:ssh -v 日志里出现 Offering public key: /path/id_ed25519,但紧接着跳过,不尝试签名。
实操建议:
- 生成后立刻执行:
chmod 600 ~/.ssh/id_ed25519 - 确认目录权限:
chmod 700 ~/.ssh(不能是 755,否则部分 OpenSSH 版本拒绝读取) - 别用
sudo生成密钥 —— 私钥归属变成 root,普通用户无法读取
公钥没正确部署到远程服务器的 authorized_keys
很多人把 id_ed25519.pub 文件整个复制过去,结果发现还是密码登录。问题常出在三处:格式换行、多余空格、权限错误。
实操建议:
- 用
ssh-copy-id自动完成(推荐):ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host,它会自动处理追加、权限和目录创建 - 手动操作时,只复制单行内容(从
ssh-ed25519开始,到邮箱结束),不要带换行、缩进或前后空格 - 检查远程
~/.ssh/authorized_keys权限:chmod 600 ~/.ssh/authorized_keys,且文件不能属于 root - 确认远程
/etc/ssh/sshd_config中PubkeyAuthentication yes已启用(改完需sudo systemctl reload sshd)
多个密钥共存时 ssh 不自动选对 key
当你有 id_rsa、id_ed25519、work_key 多个私钥,ssh 默认只试 id_rsa 和 id_ed25519,不会遍历所有文件。结果就是连特定主机时提示 Permission denied (publickey),其实 key 是对的,只是没被挑中。
实操建议:
- 在
~/.ssh/config中为每个目标主机显式指定密钥:Host work-server HostName 192.168.1.100 User alice IdentityFile ~/.ssh/work_key
- 临时指定:运行
ssh -i ~/.ssh/work_key user@host - 避免用
ssh-add全局加载 —— 它会让所有 key 都参与协商,反而增加被拒绝风险(尤其服务端限制了支持算法)
ls -l ~/.ssh/id_* 输出里没有 group/other 的 r 权限,以及 ~/.ssh 目录不是 world-writable。










