什么是 SSH 免密登录,为什么值得配置
SSH 免密登录是指通过「密钥对认证」代替「密码认证」的方式登录 Linux 服务器。配置完成后,执行 ssh 命令连接服务器时不再需要每次输入密码,登录体验更顺畅,安全性也明显更高。密钥认证的核心原理是:你在本地电脑保存一把私钥,服务器上保存对应的公钥,登录时双方通过加密算法验证匹配关系,整个过程不传输任何密码,因此可以有效避免密码被暴力破解或被键盘记录程序窃取。
对于需要频繁管理服务器的站长和运维人员来说,免密登录几乎是必配项。无论是日常登录执行命令、用 scp 传输文件,还是在自动化脚本、rsync 定时备份任务中使用 SSH,密钥认证都能省去交互输入密码的环节。本文以最常见的 Linux 或 macOS 本地环境连接 Linux 服务器为例,完整演示从生成密钥到实现免密登录的全过程,并给出配置后常见问题的排查方法。
准备工作与适用场景
在开始之前,请确认以下条件已经满足:本地电脑能正常通过密码方式 SSH 登录目标服务器;你拥有服务器的登录账号(本文以 root 为例,实际建议使用普通用户并配合 sudo);服务器端 sshd 服务运行正常。本教程适用于 CentOS、Ubuntu、Debian、Alibaba Cloud Linux 等主流发行版,OpenSSH 版本 7.0 以上均可按本文操作。
适用场景包括:每天需要多次登录服务器的运维人员;需要在定时任务中用 scp 或 rsync 自动同步文件;希望提高服务器安全等级、关闭密码登录入口;需要在一台管理机上统一管理多台服务器。如果你的服务器在公网上长期被扫描爆破,配置密钥登录并禁用密码认证是非常有效的防护手段。操作前建议先确认自己能通过服务商控制台的 VNC 或救援模式登录服务器,避免配置失误后被锁在门外。
第一步:在本地电脑生成 SSH 密钥对
打开本地终端(Windows 用户可使用 PowerShell 或 Windows Terminal),执行以下命令生成密钥对:
ssh-keygen -t ed25519 -C "your_email@example.com"
参数说明:-t 指定密钥类型,ed25519 是目前推荐的新一代算法,安全性和性能都优于传统 RSA;如果服务器系统较老不支持 ed25519,可以改用 ssh-keygen -t rsa -b 4096 生成 4096 位的 RSA 密钥。-C 只是给密钥加一个备注,方便识别,可以写成自己的邮箱或机器名。
执行后会依次提示三个问题:第一个是密钥保存路径,默认回车即可,密钥会保存在 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥);第二个是设置私钥的 passphrase(口令保护),建议设置一个口令,这样即使私钥文件泄露也不会被直接使用;第三个是再次确认口令。如果不设口令直接两次回车,就是最彻底的免输入场景,安全性上略有取舍,可按自己的安全要求决定。生成完成后,可以用以下命令查看公钥内容:
cat ~/.ssh/id_ed25519.pub
输出的以 ssh-ed25519 开头、以备注结尾的一整行就是公钥,后面需要把它上传到服务器。
第二步:把公钥上传到服务器
最简单可靠的方式是使用 OpenSSH 自带的 ssh-copy-id 命令(Linux 和 macOS 本地均可用):
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@服务器IP
执行后输入一次服务器密码,公钥就会被追加到服务器上该用户家目录的 ~/.ssh/authorized_keys 文件中,并自动设置好目录权限。如果本地是 Windows 且没有 ssh-copy-id,可以手动完成:先在本地查看公钥内容并完整复制,然后密码登录服务器,依次执行以下命令:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA...你的公钥内容... your_email@example.com" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
权限非常关键:.ssh 目录必须是 700,authorized_keys 文件必须是 600,属主是登录用户本身。权限过宽时 sshd 会出于安全考虑拒绝使用该密钥,这是配置失败最常见的隐藏原因。宝塔面板用户也可以在「安全」或终端功能中直接编辑 authorized_keys 文件粘贴公钥,效果相同。
第三步:验证免密登录是否生效
回到本地终端,直接执行登录命令:

ssh root@服务器IP
如果不再提示输入密码、直接进入服务器命令行,说明免密登录已经配置成功。如果设置了私钥口令,此时会提示输入口令,输入的是本地私钥的口令而不是服务器密码,这是正常现象。想进一步确认认证方式,可以加 -v 参数查看详细过程:
ssh -v root@服务器IP
在输出的调试信息中看到 "Offering public key" 以及后续 "Server accepts key" 字样,即表示走的是密钥认证。建议在确认密钥登录稳定可用之前,不要关闭密码登录功能;同时保持服务商控制台的紧急登录通道可用,作为最后的保底手段。
第四步(可选):配置 SSH 别名与加固服务器
如果管理的服务器较多,可以在本地 ~/.ssh/config 文件中配置别名,实现一条短命令登录:
Host myserver
HostName 服务器IP
Port 22
User root
IdentityFile ~/.ssh/id_ed25519
之后只需执行 ssh myserver 即可登录,文件上传也可以直接 scp file myserver:/root/。确认密钥登录稳定后,可以考虑加固服务器:编辑 /etc/ssh/sshd_config,将 PasswordAuthentication 设为 no 以禁用密码登录。修改配置属于影响面较大的操作,改之前建议先备份该文件(如 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak),并且不要立即断开当前会话,另开一个新终端验证能正常登录后再退出旧会话。修改后执行 systemctl restart sshd 重启服务生效,重启会导致所有现有 SSH 会话短暂受影响,请评估好业务时间再操作。另外建议同时把 PermitRootLogin 从 yes 改为 prohibit-password,即允许 root 仅用密钥登录。
常见问题排查(FAQ)
1. 配置后仍然提示输入密码怎么办?依次检查三点:服务器上 authorized_keys 文件和 .ssh 目录的权限是否为 600/700;公钥是否粘贴完整、没有多余的换行;服务器端 sshd 配置中 PubkeyAuthentication 是否被设为 no。也可以先在服务器查看 /var/log/secure(CentOS)或 /var/log/auth.log(Ubuntu/Debian)中的 SSH 认证日志定位原因。
2. 提示 Permission denied (publickey) 怎么处理?该报错表示服务器只接受密钥认证且当前密钥未通过验证。先确认登录的用户和 authorized_keys 属主一致(例如用 dev 用户登录,公钥就要放在 dev 的家目录下);再用 ssh -v 确认本地是否使用了预期的私钥文件;如果私钥权限过宽(如 644),本地会拒绝使用,执行 chmod 600 ~/.ssh/id_ed25519 修复。
3. 多台服务器可以复用同一对密钥吗?可以,把同一个公钥追加到每台服务器的 authorized_keys 即可。但从安全角度讲,更推荐为不同重要服务器生成独立密钥对,并为私钥设置口令,这样单个私钥泄露不会波及全部机器。
4. 换了电脑或误删私钥怎么办?在新电脑上重新执行 ssh-keygen 生成新密钥对,并通过密码登录(或服务商控制台 VNC)把新公钥追加到服务器 authorized_keys。只要还能通过密码或控制台登录,就无需重装系统。若已禁用密码登录且私钥全部丢失,只能通过服务商控制台的救援模式或 VNC 登录修复 authorized_keys,这也是本文反复强调保留紧急登录通道的原因。
总结
SSH 免密登录的配置核心只有两步:本地用 ssh-keygen 生成密钥对,再用 ssh-copy-id 或手动方式把公钥写入服务器的 authorized_keys,注意好 700/600 的目录与文件权限即可一次成功。配置完成后不仅登录更高效,也为自动化脚本和文件同步铺平了道路。安全加固(禁用密码登录、限制 root 权限)建议在密钥登录验证稳定、紧急登录通道可用之后再逐步实施,改任何 sshd 配置前先备份文件,并保留旧会话验证新连接。按照本文步骤操作,大多数情况下几分钟内就能完成从密码登录到密钥登录的切换。












暂无评论内容