Linux SSH 密钥登录教程:从 Windows、macOS 和 Linux 连接 Ubuntu
SSH 密钥登录适合日常管理 Linux 服务器:个人电脑保管私钥,服务器保存对应公钥,连接时完成身份验证。私钥不应该上传服务器,也不应该发给客服。本文以 Ubuntu 24.04 服务器和 OpenSSH 客户端为例;它是一套操作示例,不要求先更改 SSH 端口。
开始前:保留一条能登录的连接
准备服务器公网地址、当前 SSH 端口,以及一个能够登录并使用 sudo 的普通账号。以下使用 deploy、203.0.113.10 和端口 22,必须替换为你的实际信息;示例地址不能用于真实连接。
如果现在只能用 root 登录,先创建自己的管理账号并验证 sudo 权限,再为该账号配置密钥。本教程不会直接禁用 root,也不要求锁定账号密码。操作期间保留原 SSH 窗口,并确认控制台或救援入口可用。关闭密码认证属于最后的可选步骤,不能提前执行。
第一步:在个人电脑生成密钥
先检查电脑是否已有专门用于这台服务器的密钥。不要为了跟随教程覆盖已有文件;遇到覆盖提示,应取消并换一个新文件名。
Windows 在 PowerShell 中执行:
ssh -V
New-Item -ItemType Directory -Force "$env:USERPROFILE/.ssh" | Out-Null
ssh-keygen -t ed25519 -f "$env:USERPROFILE/.ssh/tianli_demo_ed25519"
Get-Content "$env:USERPROFILE/.ssh/tianli_demo_ed25519.pub"
macOS 或 Linux 在本机终端执行:
ssh -V
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/tianli_demo_ed25519
cat ~/.ssh/tianli_demo_ed25519.pub
生成时为私钥设置口令,并妥善保管。文件名带 .pub 的是公钥;另一个是不应分享的私钥。私钥口令是本机解锁密钥的保护,不等于服务器账号密码。Windows 找不到 ssh 时,可按照微软的 OpenSSH 说明启用客户端;公司电脑则先确认设备管理政策。
第二步:把公钥追加给正确账号
切换到已经登录的服务器窗口,确认 whoami 输出的是目标普通账号,然后执行:
# Ubuntu 服务器,以目标普通账号执行
whoami
mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
nano ~/.ssh/authorized_keys
在文件末尾新起一行,粘贴刚才的完整公钥。保留已有公钥,不要清空文件。每把密钥占一行,不能把私钥内容粘进去,也不要复制终端提示符。若账号由自动化系统管理,应使用该系统认可的配置入口,避免下次部署覆盖手工修改。
检查 .ssh 目录与 authorized_keys 的归属是否为目标账号。权限宽泛、文件属主错误或写到了 root 家目录,都会造成“明明复制了公钥却仍然登录失败”。Ubuntu OpenSSH 文档说明了公钥部署、权限和日志检查方法。
第三步:从新窗口验证,禁止偷偷退回密码
保留旧连接,在个人电脑新开窗口。Windows PowerShell 执行:
ssh -o ControlMaster=no -o ControlPath=none -o PreferredAuthentications=publickey -o PasswordAuthentication=no -o IdentitiesOnly=yes -i "$env:USERPROFILE/.ssh/tianli_demo_ed25519" -p 22 deploy@203.0.113.10
macOS 或 Linux 本机执行:
ssh -o ControlMaster=no -o ControlPath=none -o PreferredAuthentications=publickey -o PasswordAuthentication=no -o IdentitiesOnly=yes -i ~/.ssh/tianli_demo_ed25519 -p 22 deploy@203.0.113.10
首次连接要通过可信渠道核对服务器主机密钥指纹。看到“主机密钥已变化”时,应先确认是否重装或更换服务器,不能习惯性删除记录继续连接。
登录成功后执行 whoami 和 sudo -v。前者确认身份,后者确认管理员操作能力;sudo 仍可能要求账号密码,这是正常的。只有新会话独立成功,才算密钥配置完成。
可选:验证成功后关闭密码认证
先备份 SSH 配置,并检查主配置、sshd_config.d 文件及 Match 条件。OpenSSH 多数配置项以首先读取的值为准,所以随手新建一个“99”文件,未必能覆盖前面的设置。根据实际读取顺序编辑对应配置:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
上述键盘交互设置会影响通过该方式接入的多因素认证;已有此类认证时,不要直接套用。账号密码仍可能用于 sudo,不能因此删除或锁定它。OpenSSH 配置手册提供各认证项的含义。
在服务器检查语法和实际配置,成功后才重新加载:
sudo sshd -t
sudo sshd -T | grep -E 'pubkeyauthentication|passwordauthentication|kbdinteractiveauthentication'
sudo systemctl reload ssh
存在 Match 规则时,需使用 sshd -T -C 按实际用户及连接条件检查。再次新开密钥连接验证,确认无误后再关闭旧窗口。若失败,利用保留会话恢复修改前的配置,校验后重新加载。
失败时先看哪里
连接超时优先检查地址、端口和防火墙;Permission denied (publickey) 优先检查账号、公钥和权限。服务器可查看 sudo journalctl -u ssh --since "10 minutes ago",分享日志前遮盖敏感信息。日后更换电脑,应先加入并验证新公钥,再撤销旧公钥;每人使用独立密钥,离职或设备丢失时才能单独撤销。
日常维护:留好密钥用途记录
为每把公钥写清设备和使用人,定期检查仍然需要哪些入口。多人协作时,共享一个私钥会让后续撤销失去粒度;为每位维护者分配账号和密钥更便于审计。私钥备份应加密保存,并与服务器口令分开管理。更换电脑、恢复系统或重装服务器后,都重新走一次独立连接验证,不把旧电脑曾经连通过当成当前配置的证明。