Skip to content

密钥登录与权限

生成

bash
ssh-keygen -t ed25519 -C "laptop-2026"

ed25519 比 RSA 短、快、安全,没有理由再生成 RSA。-C 只是注释,方便在服务器上分辨是哪台机器的公钥。

放到服务器

bash
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@server

没有 ssh-copy-id 的话手动追加到 ~/.ssh/authorized_keys,一行一个公钥。

权限必须严格

~/.ssh                700
~/.ssh/authorized_keys 600
~/.ssh/id_ed25519      600

权限不对 sshd 会直接拒绝,而且客户端只看到 Permission denied (publickey),看不出原因。服务器上 journalctl -u sshd 会写 Authentication refused: bad ownership or modes

SELinux 环境下改完文件再跑一次 restorecon -Rv ~/.ssh

私钥从 Windows 拷到 Linux 后不能用

invalid formaterror in libcrypto,八成是换行符:Windows 的编辑器把 LF 改成了 CRLF。

bash
file ~/.ssh/id_ed25519          # 带 "with CRLF line terminators" 就是
cat -A ~/.ssh/id_ed25519 | head -3   # 行尾 ^M$ 就是
sed -i 's/\r$//' ~/.ssh/id_ed25519   # 修
ssh-keygen -y -f ~/.ssh/id_ed25519   # 修好后能打印出公钥

其它几个可能:

  • 文件末尾缺换行:echo "" >> 私钥
  • 是 PuTTY 格式:head -1 看到 PuTTY-User-Key-File-2,用 puttygen 转成 OpenSSH 格式
  • 私钥权限 644:chmod 600

Permission denied (publickey) 其实是好消息

这个报错说明 TCP 连上了、sshd 在跑、密码登录也关了,只是密钥没对上。链路是通的,剩下的问题都在本机。

客户端配置

~/.ssh/config 里给每台机器起别名:

Host web
    HostName 203.0.113.10
    User root
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 30

之后 ssh web 就行。ServerAliveInterval 防止 NAT 超时把闲置连接掐断。

个人笔记,写给未来忘事的自己。