免密登录Linux主机
安装 sshd
yum install -y openssl openssh-server
vi /etc/ssh/sshd_config
Port 22
PermitRootLogin yes
启动ssh服务
systemctl start sshd.service
重启网络
service network restart
设置开机启动ssh服务
systemctl enable sshd.service
每次在终端使用ssh链接服务器,需要输入账号、密码、端口、域名等一大堆东西,比较繁琐。若不想输入密码端口等信息,可以使用 ssh 密钥方式连接服务器。
假设Linux服务器的ip为:192.168.1.2,ssh端口:3322,以下以mac操作为例。
四种不同的密钥加密算法
| 文件名 | 算法类型 | 说明与推荐度 |
|---|---|---|
~/.ssh/id_rsa | RSA | 最经典、兼容性最好。但安全性依赖密钥长度(建议≥3072位),且密钥生成和签名速度较慢。仍可用,但已非首选。 |
~/.ssh/id_dsa | DSA | 老旧算法,已被 OpenSSH 7.0+ 默认禁用(因固定 1024 位不安全)。不建议使用,仅出现在历史遗留系统中。 |
~/.ssh/id_ecdsa | ECDSA | 基于椭圆曲线,速度比 RSA 快,密钥更短。安全性依赖于所选曲线和系统随机数质量。可用,但部分发行版/硬件支持略逊于 Ed25519。 |
~/.ssh/id_ed25519 | Ed25519 | 现代、安全、高性能的椭圆曲线算法。密钥极小,签名/验证极快。目前最佳推荐,所有主流系统均已支持。 |
核心差异总结
- 安全性排名(高到低):
Ed25519≈RSA(4096位)>ECDSA>RSA(2048位)≫DSA - 兼容性:
RSA兼容最广(老旧设备),Ed25519在 2014 年后的系统普遍支持。 - 使用建议:优先生成
ed25519密钥,若目标服务器极旧(如 RHEL 6)可备选rsa。
与免密登录的关联
- 这些
.ssh/id_xxx文件是私钥(需严格保密,权限600),对应的.pub文件是公钥(需放到服务器authorized_keys)。
生成公钥和私钥
使用ssh-keygen生成密钥:ssh-keygen -f ~/.ssh/id_rsa_sxy
可以使用 -C 添加注释,如:
ssh-keygen -f ~/.ssh/id_rsa_sxy -C "sxy21cn@qq.com"
ssh-keygen -t ed25519 -C "你的备注(如邮箱)"
默认保存位置:/.ssh/id_ed25519(私钥)、/.ssh/id_ed25519.pub(公钥)
按提示可设置密钥密码(passphrase),若不想每次使用都输入则留空直接回车。
如果客户端系统较老不支持 ed25519,可用 -t rsa -b 4096 代替。
把公钥复制到需要登录的主机
ssh-copy-id 用户名@服务器IP
# 或者指定端口和公钥文件
# ssh-copy-id -p 3322 -i ~/.ssh/id_rsa_sxy.pub songxueyan@192.168.1.2
方法二:把公钥内容复制到服务器 ~/.ssh/authorized_keys
查看客户端公钥内容:cat ~/.ssh/id_ed25519.pub
SSH 登录服务器后,将内容追加到目标用户的 ~/.ssh/authorized_keys 文件中:
mkdir -p ~/.ssh
echo "粘贴公钥内容" >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
验证登录
成功以后即可私钥链接服务器(服务器用公钥验证),使用 -i 参数指定密钥文件。
ssh -i ~/.ssh/id_rsa_sxy -p 3322 songxueyan@192.168.1.2
如果密钥名称是
id_rsa则不需要-i参数
若是从别的地方下载或者拷贝的密钥,链接时可能出现错误:
Permissions 0644 for '/Users/songyangcong/.ssh/id_rsa_sxy' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/songyangcong/.ssh/id_rsa_sxy": bad permissions
songxueyan@192.168.1.2: Permission denied (publickey).
意思是权限太大了,私钥只能创建者有读写权限,其他人不可读写。改一下权限即可。
chmod og-rw ~/.ssh/id_rsa_sxy.pub
配置 config
虽然少了账号密码,但需要指定端口和密钥,能不能一块去掉呢。
先编辑host
sudo vim /etc/hosts
绑定一个域名如下:
192.168.1.2 www.sxy91.com sxy91
测试:ping sxy91
然后编辑ssh的config文件:vim ~/.ssh/config,内容如下:
Host sxy91
HostName www.sxy91.com
User songxueyan
Port 3322
IdentityFile ~/.ssh/id_rsa_sxy
此时,无须输入端口和密码即可连接成功
ssh sxy91
遇到的问题
还需要密码
确保服务器 SSH 配置允许密钥认证
在服务器上检查配置文件 /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
确认以下配置项(去掉注释 # 并设置为 yes):
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes # 暂时保留密码登录,测试成功后再改为 no 加强安全
修改后重启 SSH 服务:
sudo systemctl restart sshd
常见问题排查
| 现象 | 可能原因 | 解决方式 |
|---|---|---|
| 仍然提示密码 | 服务器 ~/.ssh 或 authorized_keys 权限过松 | 服务器执行:chmod 700 ~/.ssh; chmod 600 ~/.ssh/authorized_keys |
| Permission denied (publickey) | 服务器未启用公钥认证 | 检查 sshd_config 中的 PubkeyAuthentication |
| 公钥已添加但无效 | 公钥内容复制时换行错误 | 确保一行完整,无多余空格换行 |
| 客户端私钥权限错误 | 客户端 ~/.ssh/id_ed25519 权限应为 600 | 执行 chmod 600 ~/.ssh/id_ed25519 |
若仍需输入密码,一般为权限问题。
服务器权限问题
# 用密码登录服务器查看 ~/.ssh 目录下文件的权限
ls -lh ~/.ssh
如果不是“ -rw-------” 那么权限不正确
# 需要把权限改成仅自己可读写
chmod -R og-wxr ~/.ssh
chmod u-x ~/.ssh/authorized_keys
说明:安全起见,sshd强制对key的文件权限进行检查,authorized_keys文件所在的目录(包括上层目录)的权限只有自己能读写,他人和组只能读。
若还有问题,调试过程如下:
ssh -vT sxy91 # 打印调试信息,查看Next authentication method: publickey 以后的行。
#发现有Offering public key,但没有Server accepts key
# 查看sshd日志
tail -f /var/log/secure
# 发现一行Authentication refused: bad ownership or modes for file ~/.ssh/authorized_keys
客户端权限问题 说明:私钥仅能自己读写。公钥其他人只能读。 若权限不正确,git或者ssh会出现id_rsa are too open错误如下:
Permissions 0644 for are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.
修改客户端的私钥公钥权限
chmod -R og-wxr ~/.ssh
chmod -R og+r ~/.ssh/*.pub
chmod -R og+r ~/.ssh/config
chmod -R og+r ~/.ssh/known_hosts
再次测试问题解决
ssh奇技淫巧
1、ssh端口转发(隧道)
#本机访问server端8080端口如下(s端防火墙只允许localhost访问):
ssh -L 8080:localhost:8080 sxy@server
2、访问server的多个绑定localhost的端口
ssh sxy@server -L 8080:localhost:8080 -L 8088:localhost:8088
3、免密转发ssh_config
# 把转发规则配置到 ~/.ssh/config
Host tunnel
HostName database.example.com
IdentityFile ~/.ssh/coolio.example.key
User sxy91
LocalForward 9906 127.0.0.1:3306
LocalForward 8806 127.0.0.1:8806
alpline 错误
如果遇到错误: channel 3: open failed: administratively prohibited: open failed
查看 sshd 配置项:
sshd -T | grep -Ei 'TCPKeepAlive|AllowTcpForwarding|PermitOpen'
# print
tcpkeepalive yes
allowtcpforwarding yes
permitopen any
修改为正确的配置:
vi /etc/ssh/sshd_config
rc-service sshd restart
参考