Linux SSH Keygen 的基本概念与重要性
在 Linux 系统管理中,SSH(Secure Shell)是一种加密的网络协议,用于远程登录、数据传输和命令执行,传统的密码认证方式虽然简单,但存在暴力破解、密码泄露等安全风险,而 SSH 密钥认证通过非对称加密技术(公钥和私钥)实现更安全的身份验证,已成为现代服务器管理的标准实践。

ssh-keygen 是 SSH 套件中用于生成和管理 SSH 密钥对的命令行工具,它支持多种加密算法(如 RSA、ECDSA、Ed25519 等),能够生成公钥和私钥,并将公钥部署到远程服务器,实现免密码登录,与密码认证相比,密钥认证具有更高的安全性、更强的抗破解能力,同时可简化自动化脚本和批量管理操作。
SSH 密钥的生成原理与算法选择
SSH 密钥基于非对称加密技术,包含一对密钥:私钥(存储在本地,需严格保密)和公钥(部署到远程服务器,用于验证私钥合法性),当用户通过 SSH 连接远程服务器时,服务器会使用公钥加密一个随机数,用户需用私钥解密该数以证明身份。
ssh-keygen 支持多种密钥算法,不同算法在安全性、性能和兼容性上存在差异:
| 算法 | 密钥长度 | 特点 | 适用场景 |
|---|---|---|---|
| RSA | 2048/4096 位 | 兼容性最好,广泛支持;4096 位安全性高,但生成和验证速度较慢 | 通用场景,兼容旧版系统 |
| ECDSA | 256/384/521 位 | 基于椭圆曲线,安全性高且速度快;521 位安全性接近 4096 位 RSA | 现代系统,追求性能与平衡 |
| Ed25519 | 256 位 | 最新算法,安全性极高,生成和验证速度最快;但部分旧版 SSH 客户端不支持 | 新建系统,支持最新 SSH 版本 |
推荐选择:
- 新建系统优先选择
Ed25519(安全性、性能最优); - 需兼容旧版系统时选择
RSA 4096; - 避免使用低于 2048 位的 RSA 密钥(存在安全风险)。
使用 ssh-keygen 生成密钥对
基本语法与参数
ssh-keygen 的基本语法为:
ssh-keygen [选项] [-t 类型] [-b 位数] [-f 文件名] [-C 注释]
常用参数说明:
-t:指定密钥类型(如rsa、ecdsa、ed25519);-b:指定密钥长度(如4096、256);-f:指定密钥文件名(默认为~/.ssh/id_rsa);-C:添加注释(通常用于标识密钥用途,如user@hostname);-N:设置私钥密码(可选,用于保护私钥文件)。
生成 RSA 4096 位密钥对
以生成 RSA 4096 位密钥为例,执行以下命令:
ssh-keygen -t rsa -b 4096 -C "admin@server1"
执行后,工具会提示输入密钥文件保存路径(直接回车使用默认路径 ~/.ssh/id_rsa)和私钥密码(可留空,但建议设置)。
生成 Ed25519 密钥对
若系统支持 OpenSSH 6.5+,可直接生成 Ed25519 密钥:
ssh-keygen -t ed25519 -C "admin@server2"
Ed25519 密钥生成速度更快,且私钥文件更小(通常仅几十字节)。
密钥文件的结构
生成密钥后,~/.ssh/ 目录下会创建以下文件:

- 私钥文件(如
id_rsa或id_ed25519):权限自动设置为600(仅所有者可读写),需严格保密; - 公钥文件(如
id_rsa.pub或id_ed25519.pub):权限自动设置为644,可公开分享; - 认证文件(
authorized_keys):存储远程服务器的公钥列表(需手动将公钥追加至此文件)。
SSH 密钥的部署与使用
将公钥复制到远程服务器
生成密钥后,需将公钥(.pub 文件)内容添加到远程服务器的 ~/.ssh/authorized_keys 文件中,推荐使用 ssh-copy-id 命令自动完成:
ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
执行后,输入远程服务器密码,工具会自动创建远程 .ssh 目录(权限 700),并将公钥追加到 authorized_keys(权限 600)。
若 ssh-copy-id 不可用,也可手动复制公钥内容:
cat ~/.ssh/id_rsa.pub | ssh user@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
配置 SSH 客户端免密码登录
完成公钥部署后,可通过以下命令测试免密码登录:
ssh user@remote_host
若配置正确,无需输入密码即可登录。
禁用密码登录(增强安全性)
为提升服务器安全性,可在远程服务器的 SSH 配置文件 /etc/ssh/sshd_config 中禁用密码登录:
PasswordAuthentication no PubkeyAuthentication yes
修改后重启 SSH 服务:
sudo systemctl restart sshd
SSH 密钥的管理与维护
列出已生成的密钥
使用以下命令查看本地已生成的密钥:
ls -la ~/.ssh/
输出示例:
-rw------- 1 user user 3247 2023-10-01 10:00 id_rsa
-rw-r--r-- 1 user user 768 2023-10-01 10:00 id_rsa.pub
-rw------- 1 user user 411 2023-10-02 11:00 id_ed25519
-rw-r--r-- 1 user user 102 2023-10-02 11:00 id_ed25519.pub
修改私钥密码
若私钥未设置密码或需修改密码,使用以下命令:
ssh-keygen -p -f ~/.ssh/id_rsa
按提示输入当前密码(若未设置则直接回车)和新密码。

删除或重命名密钥
若密钥泄露或不再使用,可直接删除对应文件:
rm ~/.ssh/id_rsa ~/.ssh/id_rsa.pub
重命名密钥文件时,需同时修改私钥和公钥文件名,并更新 SSH 客户端配置(如 ~/.ssh/config 中的 IdentityFile 指向)。
多密钥管理
当需要管理多个服务器时,可通过 ~/.ssh/config 文件为不同服务器指定不同的私钥:
Host server1
HostName 192.168.1.100
User admin
IdentityFile ~/.ssh/id_rsa_server1
Host server2
HostName 192.168.1.101
User root
IdentityFile ~/.ssh/id_ed25519_server2
配置后,可通过 ssh server1 直接连接,无需指定 -i 参数。
SSH 密钥的安全最佳实践
- 设置强密码:为私钥设置复杂密码(长度至少 12 位,包含大小写字母、数字和特殊符号);
- 限制私钥权限:确保私钥文件权限为
600,避免其他用户读取; - 定期轮换密钥:建议每 6-12 个月更换一次密钥,特别是用于高权限账户时;
- 禁用 root 直接登录:通过密钥管理普通用户账户,再通过
sudo提权,减少 root 密钥泄露风险; - 使用 SSH 代理:通过
ssh-agent缓存私钥密码,避免频繁输入(适合自动化脚本场景)。
常见问题与解决方案
问题:Permission denied (publickey,password)
原因:
- 远程服务器
authorized_keys文件权限错误(非600); - 本地私钥文件权限错误(非
600); - 远程 SSH 服务未启用公钥认证。
解决:# 修复远程服务器权限 chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh
修复本地私钥权限
chmod 600 ~/.ssh/id_rsa
#### 2. 问题:`Bad permissions: ignore key: ~/.ssh/id_rsa`
**原因**:私钥文件权限过于开放(如 `644`)。
**解决**:
```bash
chmod 600 ~/.ssh/id_rsa
问题:Ed25519 not supported
原因:远程服务器 SSH 版本过低(低于 OpenSSH 6.5)。
解决:改用 RSA 密钥或升级服务器 SSH 版本。
ssh-keygen 是 Linux 系统中实现安全远程管理的核心工具,通过合理选择密钥算法、正确生成和部署密钥对,并结合安全配置,可有效提升服务器安全性、简化运维操作,在实际使用中,需遵循安全最佳实践,定期维护密钥,确保 SSH 连接的稳定与安全。



















