Linux设置SSH免密码密钥登录
文章目录
- 设置SSH免密码密钥登录
- 第一步: 生成SSH密钥对(在客户端操作)
- 方式一:Windows 10/11 内置的 OpenSSH 客户端(推荐)
- 常用选项:
- 密钥算法选择建议
- 生成秘钥
- 方式二:借用Xshell工具生成
- 第二步:将公钥上传到服务器
- 第三步: 配置SSH服务器(在服务器上操作)
- 测试连接
- 注意事项
- 安全建议:在禁用密码登录前,请确保密钥登录正常工作
- 备份:妥善保管私钥(~/.ssh/id_rsa),丢失后将无法登录。
- 多用户:如果要为多个用户设置,请在每个用户的家目录下重复上述步骤
- 权限:`确保~/.ssh目录权限为700,authorized_keys文件权限为600`
- 故障排除
设置SSH免密码密钥登录
第一步: 生成SSH密钥对(在客户端操作)
方式一:Windows 10/11 内置的 OpenSSH 客户端(推荐)
使用ssh-keygen
软件生成
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 | 复制公钥到远程服务器 |
密钥算法选择建议
-
ed25519:
-
最安全、最现代的算法
-
密钥短、性能好
-
需要较新的 SSH 客户端/服务器支持
查询服务器支持的算法ssh -Q key
root@45:~# ssh -Q key ssh-ed25519 ssh-ed25519-cert-v01@openssh.com sk-ssh-ed25519@openssh.com sk-ssh-ed25519-cert-v01@openssh.com ecdsa-sha2-nistp256 ecdsa-sha2-nistp256-cert-v01@openssh.com ecdsa-sha2-nistp384 ecdsa-sha2-nistp384-cert-v01@openssh.com ecdsa-sha2-nistp521 ecdsa-sha2-nistp521-cert-v01@openssh.com sk-ecdsa-sha2-nistp256@openssh.com sk-ecdsa-sha2-nistp256-cert-v01@openssh.com ssh-dss ssh-dss-cert-v01@openssh.com ssh-rsa ssh-rsa-cert-v01@openssh.com
-
-
RSA 4096:
-
兼容性最好
-
密钥较长
-
仍然是安全的选择
-
-
避免使用:
-
RSA 2048(强度不足)
-
DSA(已不安全)
-
ECDSA(除非你知道为什么需要它)
-
生成秘钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
或者使用更安全的ed25519算法:
ssh-keygen -t ed25519 -C "your_email@example.com"
按提示操作(可以直接回车使用默认设置,也可以设置密码保护密钥)。
方式二:借用Xshell工具生成
-
步骤 1:打开 Xshell 密钥生成工具
- 打开 Xshell。
- 点击菜单栏 工具 (Tools) → 新建用户密钥生成向导 (New User Key Wizard)。
-
步骤 2:选择密钥类型和长度
-
密钥类型 (Key Type):
-
RSA(兼容性好,推荐 4096 位)
-
ED25519(更安全、更快,推荐优先使用)
-
密钥长度 (Key Length):
-
RSA:选择 4096(默认 2048,但 4096 更安全)
-
ED25519:固定长度(无需选择)
-
Xshell 密钥类型选择
-
-
步骤 3:生成密钥对
-
点击 下一步 (Next),Xshell 会自动生成密钥对。
-
生成完成后,会显示:
-
公钥 (Public Key):用于上传到服务器
-
私钥 (Private Key):保存在本地,需严格保密
-
-
步骤 4:设置密钥名称和密码(可选)
-
密钥名称 (Key Name):
-
给密钥取一个易识别的名字(如 my_server_key)。
-
密码 (Passphrase):
-
可选,但建议设置(即使私钥泄露,仍需密码才能使用)。
-
输入两次密码确认。
-
-
步骤 5:导出公钥和私钥(可选)
-
保存公钥 (Save as Public Key File):
-
点击 保存为文件 (Save as File),导出 .pub 文件(用于上传到服务器)。
-
保存私钥 (Save as Private Key File):
-
默认保存在 Xshell 的密钥管理器中,也可导出为 .ppk 或 .pem 格式(用于其他客户端如 PuTTY)。
-
第二步:将公钥上传到服务器
- 方法一:使用ssh-copy-id(Linux推荐,Windows上默认不支持)
ssh-copy-id username@server_ip
系统会提示输入密码,输入后公钥会自动添加到服务器的~/.ssh/authorized_keys文件中。
- 方法二:手动复制
如果ssh-copy-id不可用,可以手动操作:
查看公钥内容:
cat ~/.ssh/id_rsa.pub
登录服务器:
ssh username@server_ip
在服务器上创建.ssh目录(如果不存在):注意权限
mkdir -p ~/.ssh
chmod 700 ~/.ssh
将公钥添加到authorized_keys:注意权限
echo "你的公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
或直接通过xftp上传文件到~/.ssh
目录,把公钥文件改名为authorized_keys
注意:如果用root账号链接的xftp,上传文件会所有者和用户组都是属于root,需要修改为对应用户账号所有和所有组,否则无法使用
第三步: 配置SSH服务器(在服务器上操作)
- CentOS/RHEL系统:
sudo vi /etc/ssh/sshd_config
- Debian/Ubuntu系统:
sudo nano /etc/ssh/sshd_config
确保以下设置:
PubkeyAuthentication yes # 开启允许秘钥登录
AuthorizedKeysFile .ssh/authorized_keys # 默认为家目录下.ssh/authorized_keys
PasswordAuthentication no # 禁用密码登录(确保密钥登录工作后再设置此项)
ChallengeResponseAuthentication no
UsePAM no
保存后重启SSH服务:
- CentOS 7/RHEL 7:
sudo systemctl restart sshd
- CentOS 6/RHEL 6:
sudo service sshd restart
- Debian/Ubuntu:
sudo systemctl restart ssh
测试连接
从客户端尝试连接:
- Window cmd连接
ssh username@server_ip
如果设置正确,应该可以直接登录而无需输入密码。
- Xshell连接测试
注意事项
安全建议:在禁用密码登录前,请确保密钥登录正常工作
备份:妥善保管私钥(~/.ssh/id_rsa),丢失后将无法登录。
- 如果设置了 passphrase 但忘记密码,密钥将无法恢复,必须重新生成
- 为不同服务使用不同密钥对更安全
- 考虑使用 ssh-agent 管理密钥密码
多用户:如果要为多个用户设置,请在每个用户的家目录下重复上述步骤
权限:确保~/.ssh目录权限为700,authorized_keys文件权限为600
root上传文件到用户账号中或由其他用户账号上传到不是自己家目录只,必须修改对应的权限才能使用
故障排除
-
检查/var/log/secure(CentOS)或/var/log/auth.log(Debian)中的错误信息
-
临时启用密码登录并检查配置
-
确保SELinux(CentOS)没有阻止访问(可以尝试setenforce 0临时禁用测试)
sudo setenforce 0 ` # 将 SELinux 设置为 permissive 模式(临时方案,重启后恢复)
-
永久解决方案
- 方法一: 添加 SELinux 策略
sudo ausearch -c 'sshd' --raw | audit2allow -M my-sshd sudo semodule -i my-sshd.pp
- 方法二:恢复正确的文件上下文
sudo restorecon -Rv ~/.ssh sudo restorecon -Rv /home