在服务器上添加客户端公钥的核心是通过将客户端生成的 .pub 公钥文件内容写入服务器目标用户家目录下的 .ssh/authorized_keys 文件中,从而利用非对称加密算法实现无需密码的身份验证。
为什么行业共识倾向于使用公钥认证替代密码登录
在运维实际场景中,依赖密码登录的服务器面临着极高的暴力破解风险,业内专家指出,针对 SSH 22 端口的自动化扫描攻击在公网环境下几乎是每秒都在发生。
密码登录与公钥认证的安全性对比
- 密码登录:依赖于用户记忆的字符串,容易被弱口令攻击或通过截获流量(在未加密通道下)获取。
- 公钥认证:基于 RSA 或 Ed25519 等非对称加密算法,私钥保存在客户端且永不传输,服务器仅持有公钥,即使公钥泄露,攻击者也无法在没有私钥的情况下伪造身份。
核心维度对比表
| 维度 | 密码登录 | 公钥认证 (SSH Key) | 风险等级 |
|---|---|---|---|
| 验证机制 | 对比明文/哈希值 | 非对称加密签名验证 | 低 (公钥) |
| 便捷程度 | 每次需手动输入 | 配置一次,永久免密 | 高 (效率) |
| 破解难度 | 易受暴力破解/字典攻击 | 极难(需破解私钥) | 极低 |
| 自动化支持 | 需第三方工具(如 expect) | 原生支持脚本自动化 | 极高 |
Linux服务器添加SSH公钥步骤详解
实现免密登录的操作分为三个阶段:客户端生成密钥对、将公钥传输至服务器、验证连接。
客户端生成密钥对
在本地终端(Linux, macOS 或 Windows PowerShell)执行生成命令,目前行业推荐使用 Ed25519 算法,因为它比传统的 RSA 具有更高的安全性和更短的密钥长度。
- 生成 Ed25519 密钥(推荐):
ssh-keygen -t ed25519 -C "your_email@example.com" - 生成 RSA 密钥(兼容性强):
ssh-keygen -rsa -b 4096 -C "your_email@example.com"
执行后,系统会提示保存路径,默认通常为 ~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)。私钥必须严格保密,严禁上传至任何公共平台。
将公钥传输至服务器
传输公钥有两种主流方式,根据环境权限选择。
使用 ssh-copy-id 工具(最高效)
这是最推荐的自动化方式,它会自动处理目录创建和权限设置。
- 执行命令:
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@server_ip - 执行逻辑:该工具会通过密码登录服务器,在
~/.ssh/目录下创建文件夹,并将公钥内容追加到authorized_keys文件末尾。
手动复制粘贴(适用于受限环境)
如果服务器禁用了 ssh-copy-id 或处于特殊安全区域,可采用手动方式。
- 步骤 1:在本地查看公钥内容:
cat ~/.ssh/id_ed25519.pub - 步骤 2:登录服务器,创建目录并写入:
mkdir -p ~/.ssh
echo "粘贴刚才复制的公钥内容" >> ~/.ssh/authorized_keys
Ubuntu服务器配置SSH公钥免密登录教程
在 Ubuntu 或 Debian 等系统中,除了传输公钥,还需要确保服务器端的 SSH 配置和文件权限正确,否则 SSH 服务会出于安全考虑拒绝使用密钥登录。
严格的文件权限设置
SSH 守护进程 sshd 对权限检查极其苛刻,如果权限过高(如组用户可写),认证将直接失效。
- 用户家目录:权限不能为 777,建议
755
或 700。 - .ssh 目录:必须设置为 700 (
drwx------)。 - authorized_keys 文件:必须设置为 600 (
-rw-------)。
快速修复权限命令:chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
修改 sshd_config 配置文件
需要确保服务器允许公钥认证,编辑配置文件 /etc/ssh/sshd_config:
- 检查以下项是否为 yes:
PubkeyAuthentication yes - 禁用密码登录(在确认密钥生效后执行):
PasswordAuthentication no - 禁用 root 直接登录(增强安全):
PermitRootLogin prohibit-password
修改完成后,必须重启 SSH 服务使配置生效:sudo systemctl restart ssh
ssh-copy-id命令失效怎么办
在实际操作中,经常会遇到 ssh-copy-id 报错或执行后依然要求输入密码的情况。
常见失效原因分析
- 服务器禁用了密码认证:如果服务器已经设置了
PasswordAuthentication no,则ssh-copy-id无法通过密码登录去上传公钥。 - 权限不匹配:服务器端的
.ssh目录权限被错误设置为 777。 - SELinux 拦截:在 CentOS/RHEL 系统中,SELinux 可能会阻止 SSH 读取非标准路径的密钥文件。
解决方案路径
- 针对密码禁用:通过云平台控制台的 VNC 终端手动将公钥写入
authorized_keys。 - 针对权限问题:执行
chmod 700 ~/.ssh。 - 针对 SELinux:尝试执行
restorecon -Rv ~/.ssh恢复默认安全上下文。
进阶安全加固与多密钥管理
对于管理多台服务器的开发者,单一的密钥对可能不足以满足隔离需求。
使用 SSH Config 管理多台服务器
在本地 ~/.ssh/config 文件中定义别名,避免每次输入长 IP 和指定密钥路径。
Host web-server HostName 1.2.3.4 User deploy IdentityFile ~/.ssh/id_ed25519_web Host db-server HostName 1.2.3.5 User admin IdentityFile ~/.ssh/id_ed25519_db
配置后,直接使用 ssh web-server 即可自动匹配对应的私钥登录。
公钥认证与密码登录哪个更安全
从加密强度来看,公钥认证在数学层面远超传统的密码验证,据统计,绝大多数针对 SSH 的攻击是通过尝试常见密码组合实现的,公钥认证将攻击面从“猜测字符串”转移到了“破解 256 位或 4096 位加密密钥”,在目前的计算能力下,后者几乎是不可能的。
行业共识认为,生产环境的服务器应当在完成公钥部署后,立即关闭密码登录功能,仅保留密钥认证,这是构建基础安全防线的底线要求。
在服务器上添加客户端公钥是提升运维效率与安全性的标准操作,其核心流程为:本地生成 Ed25519 密钥 $rightarrow$ 通过 ssh-copy-id 或手动方式将公钥写入服务器 authorized_keys $rightarrow$ 严格限制 .ssh 目录权限为 700 $rightarrow$ 关闭 sshd 密码认证。
关于服务器添加客户端公钥的常见问题 Q&A
问:一个服务器用户可以添加多个客户端公钥吗?
答:可以。authorized_keys 文件支持多行存储,每行代表一个公钥,你可以将不同开发者的公钥依次追加到该文件中,服务器在验证时会依次匹配,只要客户端持有其中任何一个对应的私钥即可登录。
问:如果私钥丢失了,还能通过公钥登录吗?
答:不能,公钥仅用于验证,私钥用于签名,如果私钥丢失且服务器关闭了密码登录,你将彻底失去该用户的 SSH 访问权限,此时必须通过云平台控制台的救援模式或 VNC 终端登录,手动删除或更换 authorized_keys 中的公钥。
问:公钥和私钥在传输过程中可以互换吗?
答:绝对不可以,公钥(Public Key)是公开的,可以随意发送给任何服务器;私钥(Private Key)必须严格保存在本地且不被任何人知晓,如果将私钥上传至服务器,一旦服务器被攻破,攻击者将获得该私钥并能以此身份访问所有信任该私钥的其他服务器。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/488504.html



