【踩坑日记】【教程】如何在ubuntu服务器上配置公钥登录以及bug解决
前言
在日常开发和运维中,为了提高服务器登录的安全性,我们通常会选择使用 SSH 密钥认证 来替代传统的密码登录。然而,在配置 SSH 公钥登录的过程中,可能会遇到各种坑和 Bug。本文将从零开始,手把手教你如何在 Ubuntu 服务器上配置 SSH 公钥登录,并分享实际操作中遇到的问题及其解决方法。
环境说明
- 本地设备:Windows 10
- 远程服务器:Ubuntu
- 操作目标:通过 SSH 公钥认证登录 Ubuntu 服务器
一、SSH 公钥登录的配置步骤
1. 在本地生成 SSH 密钥对
首先,我们需要在本地生成一对 SSH 密钥(公钥和私钥)。在 Windows 上可以使用终端工具(如 PowerShell、Git Bash 或 WSL)运行以下命令:
ssh-keygen -t rsa -b 2048
- 系统会提示保存密钥文件的位置,默认路径为
C:\Users\<你的用户名>\.ssh\id_rsa
。 - 按照提示操作,回车即可完成。如果需要为密钥设置密码,可以自行输入(可选)。
最终会生成以下两个文件:
id_rsa
:私钥,保存在本地,用于身份认证。请妥善保管,切勿泄露。id_rsa.pub
:公钥,上传到服务器,用于验证身份。
2. 将公钥上传到服务器
在 Windows 上没有 ssh-copy-id
工具,因此我们需要手动上传公钥到服务器。
方法 1:手动复制公钥
-
查看本地公钥内容:
type C:\Users\<你的用户名>\.ssh\id_rsa.pub
复制输出内容。
-
登录到服务器:
ssh username@server_ip
替换
username
和server_ip
为你的服务器用户名和 IP 地址。 -
在服务器上创建
.ssh
文件夹并设置权限:mkdir -p ~/.ssh chmod 700 ~/.ssh
-
编辑或创建
authorized_keys
文件,将公钥内容粘贴进去:nano ~/.ssh/authorized_keys
粘贴后保存并退出。
-
设置文件权限:
chmod 600 ~/.ssh/authorized_keys
3. 测试 SSH 公钥登录
完成上述步骤后,退出服务器并尝试使用 SSH 密钥登录:
ssh -i C:\Users\<你的用户名>\.ssh\id_rsa username@server_ip
如果配置正确,你应该可以直接登录而无需输入密码。
二、遇到的 Bug 和解决过程
问题描述
在本地配置好公钥后,仍然无法通过 SSH 密钥登录服务器,客户端一直提示需要输入密码。查看服务器日志后发现以下错误:
Failed password for hw from 192.168.0.100 port 54545 ssh2
排查与解决过程
-
检查 SSH 服务配置
编辑服务器上的/etc/ssh/sshd_config
文件,确保以下配置项正确:PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication yes # 用于调试时保留
修改完成后,重启 SSH 服务:
sudo systemctl restart ssh
-
检查
authorized_keys
文件权限
确保~/.ssh
文件夹和authorized_keys
文件的权限正确:chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys
-
检查文件所有者
问题的根本原因是:authorized_keys
文件的所有者不正确。通过以下命令发现文件归属不是登录的用户:ls -l ~/.ssh/authorized_keys
修复所有权问题:
chown username:username ~/.ssh/authorized_keys
再次尝试登录,问题解决。
三、从其他设备登录服务器
1. 如何避免安全警告
当你从另一台设备首次连接到服务器时,客户端会提示以下信息:
The authenticity of host '192.168.0.22' can't be established.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
这属于正常现象,因为这是 SSH 的安全机制,用于防止中间人攻击。如果确定服务器可信,可以输入 yes
接受。
客户端会将服务器的主机密钥保存到本地 ~/.ssh/known_hosts
文件中,之后不再提示。
2. 多设备登录是否会互相影响?
SSH 支持多个设备同时连接到同一个服务器账户,不会因为从一台设备登录而「顶掉」另一台设备的会话。你可以通过以下命令查看所有当前活动的 SSH 会话:
who
或者:
w
例如,输出如下:
username pts/0 192.168.0.100 17:40 (bash)
username pts/1 192.168.0.101 17:50 (bash)
这里表示同一个用户通过两台设备分别从 IP 192.168.0.100
和 192.168.0.101
登录。