马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
每次登录都输密码很烦,但把服务器密码改弱又更危险。SSH 密钥登录是正解:本地留私钥、服务器放公钥,之后登录不用密码。这篇走完整流程,并把最容易卡住的权限和 SELinux 两处讲透。
一、第一步:在客户端生成密钥对
1.1 ssh-keygen 的常用选项
-t 指定类型(rsa / ed25519 / ecdsa)
-b 指定长度(RSA、ECDSA 有效)
-C 加注释,标识用途
-f 指定保存路径
-N 直接设密钥密码,避免交互
-p 改已有密钥的密码
-q 静默模式
常用组合:
| 命令 | 用途 |
ssh-keygen -t rsa -b 4096 | 生成 RSA 4096 密钥 |
ssh-keygen -t ed25519 | 生成 ed25519 密钥(推荐) |
ssh-keygen -p -f ~/.ssh/id_rsa | 改密钥密码 |
ssh-keygen -l -f ~/.ssh/id_rsa.pub | 查看密钥指纹 |
ssh-copy-id user@host | 复制公钥到远程服务器 |
1.2 算法怎么选
- ed25519:最现代、密钥短、性能好,需要较新的 SSH 客户端/服务端。先查服务端支不支持:
ssh -Q key,列表里有 ssh-ed25519 就能用。
- RSA 4096:兼容性最好,代价是密钥长,依然安全。
- 别用的:RSA 2048(强度不足)、DSA(已不安全)、ECDSA(除非明确知道为什么)。
ssh-keygen -t ed25519 -C "[email protected]"
一路回车用默认设置,也可以设一个 passphrase 给密钥再上一把锁。
Windows 10/11 自带 OpenSSH 客户端,直接用上面的命令即可;用 Xshell 的话走「工具 → 新建用户密钥生成向导」,选 RSA 4096 或 ED25519,生成后公钥用来上传、私钥本地保存,可设名称与 passphrase,也能导出成 PuTTY 能读的 .ppk。
二、第二步:把公钥传到服务器
2.1 ssh-copy-id(Linux 下推荐)
ssh-copy-id username@server_ip
提示输密码后,公钥自动追加到服务器的 ~/.ssh/authorized_keys。
2.2 手动复制(ssh-copy-id 不可用时)
cat ~/.ssh/id_rsa.pub # 客户端看公钥
ssh username@server_ip # 登录服务器
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
也可以直接用 FTP 工具把公钥文件传上去再改名成 authorized_keys。注意:如果用 root 身份上传,文件的属主属组会变成 root,必须 chown 成目标用户,否则用不了。
三、第三步:改服务端配置
# CentOS / RHEL
sudo vi /etc/ssh/sshd_config
# Debian / Ubuntu
sudo nano /etc/ssh/sshd_config
确保这几行:
PubkeyAuthentication yes # 开启密钥登录
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no # 确认密钥登录可用后再关密码
ChallengeResponseAuthentication no
UsePAM no
重启服务:
# CentOS 7 / RHEL 7
sudo systemctl restart sshd
# CentOS 6 / RHEL 6
sudo service sshd restart
# Debian / Ubuntu
sudo systemctl restart ssh
测一下:
ssh username@server_ip
不再要密码就说明成了。别急着关旧会话,先开着验证。
四、权限:最容易翻车的地方
~/.ssh 目录权限必须是 700。
authorized_keys 权限必须是 600。
- 私钥
~/.ssh/id_rsa 也设 600,别外泄。
- 用 root 传文件到别的用户家目录,务必
chown 用户:用户组 改回去。
- 多个用户各自在自己的家目录下重复这套流程,互不影响。
五、排障的四个方向
- 看日志
:CentOS 看 /var/log/secure,Debian 看 /var/log/auth.log。
- 先开密码登录排查:确认能密码登录后,再逐步切到密钥。
- SELinux 拦了(CentOS 常见):临时
sudo setenforce 0 验证是不是它;永久方案两条路——- 生成策略:
sudo ausearch -c 'sshd' --raw | audit2allow -M my-sshd 然后 sudo semodule -i my-sshd.pp;
- 恢复上下文:
sudo restorecon -Rv ~/.ssh 和 sudo restorecon -Rv /home。
- 权限不对:回到第四节那三条,优先chmod 700/600。
- 禁用密码登录前先确认密钥能用,否则把自己锁在门外。
- 私钥丢了就进不去了,务必备份;设了 passphrase 又忘了密码,只能重新生成。
- 不同服务用不同密钥对,泄露一个不影响全局。
- 想免输密码又要带钥匙串,用
ssh-agent 统一管理。
结论
密钥登录三步:客户端 ssh-keygen -t ed25519 生成 → 公钥用 ssh-copy-id 或手动写进 ~/.ssh/authorized_keys → 服务端 PubkeyAuthentication yes 并重启 sshd。成败九成在权限(700/600)和 SELinux 上下文(restorecon)上;确认登录成功之后,再把 PasswordAuthentication 关掉。
qidao123.com企服评测-应用市场 编辑提示 |