Linux命令-ssh-keygen(生成 SSH 密钥对)
-
- 快速参考
- 密钥类型对比
- 生成密钥对
- 常用选项详解
- 密钥管理操作
- 高级功能
- 不同场景的密钥策略
- 批量生成与自动化
- 公钥文件格式
ssh-keygen 是 SSH 协议套件中的密钥生成工具,用于创建、管理和转换 SSH 认证密钥。它支持多种密钥算法(RSA、DSA、ECDSA、Ed25519),可以生成公钥/私钥对,是 SSH 安全认证体系的基础。
快速参考
ssh-keygen [选项]
ssh-keygen 生成的密钥对包括私钥(默认为 ~/.ssh/id_<type>)和公钥(~/.ssh/id_<type>.pub)。私钥永远不能分享,公钥可以安全分发。
密钥类型对比
| Ed25519 | 256 | 极高 | 最快 | OpenSSH 6.5+ | 首选 |
| ECDSA | 256/384/521 | 高 | 快 | 较广泛 | 推荐 |
| RSA | 3072 | 高 | 较慢 | 最广泛 | 可用 |
| DSA | 1024 | 低 | 慢 | 废弃 | 禁用 |
生成密钥对
# 推荐:生成 Ed25519 密钥(现代、快速、安全)
ssh-keygen -t ed25519 -C "user@example.com"
# 生成 Ed25519 并指定文件名
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_prod -C "production_key"
# 生成 RSA 密钥(4096 位)
ssh-keygen -t rsa -b 4096 -C "rsa_legacy_key"
# 生成 ECDSA 密钥(521 位曲线)
ssh-keygen -t ecdsa -b 521 -C "ecdsa_backup_key"
# 无交互生成(用于脚本/CI)
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key -N "" -C "ci_deploy"
# 生成密钥并设置强密码
ssh-keygen -t ed25519 -f ~/.ssh/important_key -C "encrypted_key"
# 交互式输入密码(推荐!)
常用选项详解
# -t: 指定密钥类型
ssh-keygen -t ed25519 # 推荐
ssh-keygen -t ecdsa # 备用
ssh-keygen -t rsa # 传统兼容
# -b: 密钥位数
ssh-keygen -t rsa -b 4096
ssh-keygen -t ecdsa -b 521
# -C: 注释(通常放邮箱/标识)
ssh-keygen -t ed25519 -C "admin@company.com"
# -f: 输出文件名
ssh-keygen -t ed25519 -f ~/.ssh/github_key -C "github_personal"
# -N: 密码(空串 = 无密码,-N "" 为无密码)
ssh-keygen -t ed25519 -f ~/.ssh/auto_key -N ""
# -P: 修改密码时指定旧密码
# -p: 修改密码(交互式)
密钥管理操作
# 修改已有密钥的密码
ssh-keygen -p -f ~/.ssh/id_ed25519
# 修改指定密钥的密码(非交互)
ssh-keygen -p -P "old_password" -N "new_password" -f ~/.ssh/id_ed25519
# 移除密码
ssh-keygen -p -P "current_password" -N "" -f ~/.ssh/id_ed25519
# 查看公钥指纹(多种格式)
ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 256 SHA256:xxxxx… user@example.com (ED25519)
# 使用 MD5 格式指纹
ssh-keygen -E md5 -lf ~/.ssh/id_ed25519.pub
# 从私钥重建公钥
ssh-keygen -y -f ~/.ssh/id_ed25519 > recovered.pub
# 确认恢复的公钥与原始一致
diff recovered.pub ~/.ssh/id_ed25519.pub && echo "一致"
高级功能
# 转换密钥格式(PEM → OpenSSH 新格式)
ssh-keygen -p -m PEM -f ~/.ssh/old_rsa_key
# 从 PEM 转为 OpenSSH 格式
ssh-keygen -p -m RFC4716 -f ~/.ssh/id_rsa
# 生成主机密钥(系统管理员操作)
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
# 吊销已泄露的公钥(创建 KRL)
ssh-keygen -k -f revoked_keys.krl ~/.ssh/compromised_key.pub
# 测试证书 KRL
ssh-keygen -Q -f revoked_keys.krl ~/.ssh/compromised_key.pub
# 签署用户证书(CA 操作)
ssh-keygen -s ca_key -I user_id -n username -V +52w user_key.pub
# 生成 SSHFP DNS 记录
ssh-keygen -r hostname.example.com
不同场景的密钥策略
# 场景 1: GitHub 个人密钥
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_github -C "github@example.com"
# 场景 2: 生产服务器部署密钥
ssh-keygen -t ed25519 -f ~/.ssh/prod_deploy -C "deploy@production" -N ""
# ⚠️ 部署密钥无密码,需严格保护私钥文件
# 场景 3: 临时 CI 密钥
TEMP_KEY="/tmp/ci_temp_key"
ssh-keygen -t ed25519 -f "$TEMP_KEY" -N "" -C "ci_temp"
# 使用后立即销毁
shred -u "$TEMP_KEY" "$TEMP_KEY.pub"
# 场景 4: 高安全需求密钥
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/high_sec_key -C "high_security"
# -a 100: KDF 轮数(增加暴力破解难度)
批量生成与自动化
# 为多台服务器生成统一密钥
SERVERS=("web1" "web2" "db1" "db2")
for server in "${SERVERS[@]}"; do
ssh-keygen -t ed25519 \\
-f ~/.ssh/"${server}_key" \\
-N "" \\
-C "${server}@company.com" \\
-q # 静默模式
echo "已生成: ${server}_key"
done
# 密钥审计脚本
audit_keys() {
echo "===== SSH 密钥审计 ====="
echo "时间: $(date)"
echo ""
for key in ~/.ssh/id_*; do
if [[ "$key" != *.pub ]]; then
echo "— $(basename "$key") —"
ssh-keygen -lf "$key" 2>/dev/null
stat -c "权限: %a 修改: %y" "$key"
echo ""
fi
done
}
audit_keys
# 检查弱密钥
# DSA 密钥不应再使用
find ~/.ssh/ -name "id_dsa*" -exec echo "⚠️ DSA 密钥已废弃: {}" \\;
# RSA < 2048 位的密钥不安全
for key in ~/.ssh/id_rsa; do
[ -f "$key" ] || continue
BITS=$(ssh-keygen -lf "$key" | awk '{print $1}')
if [ "$BITS" -lt 2048 ]; then
echo "⚠️ RSA 密钥位数不足: $key ($BITS bit)"
fi
done
公钥文件格式
# 公钥文件内容结构
cat ~/.ssh/id_ed25519.pub
# ssh-ed25519 AAAAC3NzaC1lZ… comment@example.com
# |算法类型| |——- Base64 编码公钥 ——–| |—- 注释 —-|
# 公钥的四种查看方式
# 1. 直接读取文件
cat ~/.ssh/id_ed25519.pub
# 2. 从私钥导出
ssh-keygen -y -f ~/.ssh/id_ed25519
# 3. 查看指纹
ssh-keygen -lf ~/.ssh/id_ed25519.pub
# 4. 从 ssh-agent 列出
ssh-add -L
安全准则:
- Ed25519 是现代 Linux 环境的最佳选择
- 绝不共享私钥,私钥权限必须是 600
- 为不同目的使用不同密钥对
- 定期审查并吊销不再使用的公钥





