外观
密钥登录与权限
生成
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 format 或 error 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 超时把闲置连接掐断。