Dropbear SSH 完全指南 / 08 - dropbearkey 工具
第八章:dropbearkey 工具
8.1 dropbearkey 概述
dropbearkey 是 Dropbear 套件中的密钥生成和管理工具,功能等同于 OpenSSH 的 ssh-keygen,但专门为 Dropbear 的密钥格式设计。
dropbearkey 命令行语法
dropbearkey -t <密钥类型> -f <密钥文件> [-s <密钥大小>] [-C <注释>]
dropbearkey -y -f <密钥文件> # 显示公钥信息
选项完整参考
| 选项 | 参数 | 说明 |
|---|---|---|
-t | type | 密钥类型:rsa, ed25519, ecdsa, dss |
-f | filename | 密钥文件路径 |
-s | bits | 密钥大小(RSA: 位数,ECDSA: 256/384/521) |
-C | comment | 密钥注释 |
-y | — | 显示公钥信息和指纹 |
8.2 生成各类密钥
Ed25519 密钥(推荐)
# 生成 Ed25519 主机密钥
sudo dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key
# 生成用户密钥
dropbearkey -t ed25519 -f ~/.ssh/id_dropbear_ed25519
# 带注释
dropbearkey -t ed25519 -f ~/.ssh/id_dropbear_ed25519 -C "admin@mydevice"
Ed25519 特性:
| 属性 | 值 |
|---|---|
| 密钥大小 | 256-bit(固定) |
| 签名大小 | 512-bit(固定) |
| 安全等级 | 等效 ~128-bit 对称加密 |
| 生成速度 | 极快 |
| 签名速度 | 极快 |
| 公钥格式 | 与 OpenSSH 通用 |
| 推荐场景 | 所有新部署 |
RSA 密钥
# 生成 RSA 主机密钥(默认 2048-bit)
sudo dropbearkey -t rsa -s 4096 -f /etc/dropbear/dropbear_rsa_host_key
# 生成用户密钥
dropbearkey -t rsa -s 4096 -f ~/.ssh/id_dropbear_rsa
# 带注释
dropbearkey -t rsa -s 4096 -f ~/.ssh/id_dropbear_rsa -C "admin@mydevice"
RSA 特性:
| 密钥大小 | 安全等级 | 生成速度 | 建议 |
|---|---|---|---|
| 1024-bit | 不安全 | 快 | ❌ 已弃用 |
| 2048-bit | ~112-bit | 中 | ⚠️ 最低要求 |
| 3072-bit | ~128-bit | 慢 | ✅ 推荐 |
| 4096-bit | ~140-bit | 很慢 | ✅ 高安全 |
ECDSA 密钥
# 生成 256-bit ECDSA 密钥
dropbearkey -t ecdsa -s 256 -f /etc/dropbear/dropbear_ecdsa_host_key
# 生成 384-bit ECDSA 密钥
dropbearkey -t ecdsa -s 384 -f /etc/dropbear/dropbear_ecdsa_host_key
# 生成 521-bit ECDSA 密钥
dropbearkey -t ecdsa -s 521 -f /etc/dropbear/dropbear_ecdsa_host_key
ECDSA 特性:
| 大小 | 曲线 | 安全等级 | 推荐度 |
|---|---|---|---|
| 256 | P-256 (secp256r1) | ~128-bit | ✅ |
| 384 | P-384 (secp384r1) | ~192-bit | ✅ |
| 521 | P-521 (secp521r1) | ~256-bit | ✅ |
注意: ECDSA 有争议性问题——如果随机数生成有缺陷,私钥可能泄露。Ed25519 没有这个问题,因此更推荐 Ed25519。
DSS/DSA 密钥(已弃用)
# 生成 DSS 密钥(不推荐)
dropbearkey -t dss -f /etc/dropbear/dropbear_dss_host_key
安全警告: DSS/DSA 仅支持 1024-bit 密钥,安全性不足。NIST 已于 2013 年弃用 DSA。不应在新部署中使用。
8.3 查看密钥信息
显示公钥和指纹
# 显示公钥信息和指纹
dropbearkey -y -f /etc/dropbear/dropbear_ed25519_host_key
# 输出示例:
# Public key portion is:
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGrSX5zYpE9HGMN7QjHr3Xbx8VW6R8QmY2j admin@mydevice
# Fingerprint: SHA256:xR3bP7kF9v2mL5nQ4wJ8hT6yU1iO3pA5sD7fG9hJ
提取公钥到文件
# 提取公钥到单独文件
dropbearkey -y -f /etc/dropbear/dropbear_ed25519_host_key | \
head -2 | tail -1 > /etc/dropbear/dropbear_ed25519_host_key.pub
# 验证
cat /etc/dropbear/dropbear_ed25519_host_key.pub
脚本化指纹提取
#!/bin/sh
# get_key_info.sh - 提取密钥信息
KEYFILE="$1"
if [ -z "$KEYFILE" ] || [ ! -f "$KEYFILE" ]; then
echo "用法: $0 <密钥文件>"
exit 1
fi
echo "=== 密钥信息 ==="
echo "文件: $KEYFILE"
echo "大小: $(du -h "$KEYFILE" | awk '{print $1}')"
echo ""
# 获取完整输出
OUTPUT=$(dropbearkey -y -f "$KEYFILE" 2>&1)
echo "$OUTPUT"
echo ""
# 提取指纹
FINGERPRINT=$(echo "$OUTPUT" | grep Fingerprint | awk '{print $NF}')
echo "指纹 (可复制): $FINGERPRINT"
# 提取公钥行
PUBKEY=$(echo "$OUTPUT" | grep "^ssh-")
echo "公钥 (可复制): $PUBKEY"
8.4 dropbearconvert 格式转换工具
dropbearconvert 用于在 Dropbear 格式和 OpenSSH 格式之间转换密钥。
语法
dropbearconvert <输入格式> <输出格式> <输入文件> <输出文件>
格式标识:
dropbear— Dropbear 原生格式openssh— OpenSSH 格式(新格式,PEM)
Dropbear → OpenSSH
# RSA 私钥转换
dropbearconvert dropbear openssh ~/.ssh/id_dropbear_rsa ~/.ssh/id_rsa
# Ed25519 私钥转换
dropbearconvert dropbear openssh ~/.ssh/id_dropbear_ed25519 ~/.ssh/id_ed25519
# ECDSA 私钥转换
dropbearconvert dropbear openssh ~/.ssh/id_dropbear_ecdsa ~/.ssh/id_ecdsa
OpenSSH → Dropbear
# RSA 私钥转换
dropbearconvert openssh dropbear ~/.ssh/id_rsa ~/.ssh/id_dropbear_rsa
# Ed25519 私钥转换
dropbearconvert openssh dropbear ~/.ssh/id_ed25519 ~/.ssh/id_dropbear_ed25519
# ECDSA 私钥转换
dropbearconvert openssh dropbear ~/.ssh/id_ecdsa ~/.ssh/id_dropbear_ecdsa
转换兼容性矩阵
| 密钥类型 | Dropbear → OpenSSH | OpenSSH → Dropbear |
|---|---|---|
| RSA | ✅ | ✅ |
| Ed25519 | ✅ | ✅ |
| ECDSA | ✅ | ✅ |
| DSS | ✅ | ✅ |
注意: Ed25519 公钥在两个实现中格式相同,私钥需要转换。RSA 私钥格式差异最大,必须使用
dropbearconvert转换。
批量转换脚本
#!/bin/sh
# convert_keys.sh - 批量密钥格式转换
INPUT_DIR="$1"
OUTPUT_DIR="$2"
FORMAT="${3:-openssh}" # 目标格式:openssh 或 dropbear
if [ -z "$INPUT_DIR" ] || [ -z "$OUTPUT_DIR" ]; then
echo "用法: $0 <输入目录> <输出目录> [openssh|dropbear]"
exit 1
fi
mkdir -p "$OUTPUT_DIR"
# 检测源格式
detect_format() {
local file="$1"
head -1 "$file" | grep -q "DROPBEAR" && echo "dropbear" || echo "openssh"
}
# 转换密钥
for keyfile in "$INPUT_DIR"/id_*; do
[ -f "$keyfile" ] || continue
[ "${keyfile%.pub}" = "$keyfile" ] || continue # 跳过公钥
SOURCE_FORMAT=$(detect_format "$keyfile")
BASENAME=$(basename "$keyfile")
OUTPUT_FILE="$OUTPUT_DIR/$BASENAME"
echo "转换: $BASENAME ($SOURCE_FORMAT → $FORMAT)"
dropbearconvert "$SOURCE_FORMAT" "$FORMAT" "$keyfile" "$OUTPUT_FILE"
chmod 600 "$OUTPUT_FILE"
done
echo "转换完成"
8.5 密钥格式详解
Dropbear 私钥格式
Dropbear 使用自有的私钥格式,以文本头尾标识:
---- BEGIN DROPBEAR RSA KEY ----
<base64 编码数据>
---- END DROPBEAR RSA KEY ----
---- BEGIN DROPBEAR ECDSA KEY ----
<base64 编码数据>
---- END DROPBEAR ECDSA KEY ----
---- BEGIN DROPBEAR ED25519 KEY ----
<base64 编码数据>
---- END DROPBEAR ED25519 KEY ----
---- BEGIN DROPBEAR DSS KEY ----
<base64 编码数据>
---- END DROPBEAR DSS KEY ----
OpenSSH 私钥格式
OpenSSH 使用 PEM 格式或新的 OpenSSH 格式:
# 旧 PEM 格式(RSA)
-----BEGIN RSA PRIVATE KEY-----
<base64 编码数据>
-----END RSA PRIVATE KEY-----
# 新 OpenSSH 格式(所有类型)
-----BEGIN OPENSSH PRIVATE KEY-----
<base64 编码数据>
-----END OPENSSH PRIVATE KEY-----
公钥格式
公钥格式在 Dropbear 和 OpenSSH 之间完全兼容:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGrS... comment
ssh-rsa AAAAB3NzaC1yc2EAAAA... comment
ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYT... comment
8.6 密钥算法对比与选择
完整对比表
| 算法 | 密钥大小 | 安全等级 | 生成速度 | 签名速度 | 验证速度 | 体积 | 推荐度 |
|---|---|---|---|---|---|---|---|
| Ed25519 | 256-bit | ★★★★★ | 极快 | 极快 | 极快 | 小 | ✅ 首选 |
| ECDSA P-256 | 256-bit | ★★★★☆ | 快 | 快 | 快 | 小 | ✅ 推荐 |
| ECDSA P-384 | 384-bit | ★★★★☆ | 中 | 中 | 中 | 中 | ✅ |
| RSA 2048 | 2048-bit | ★★★☆☆ | 中 | 慢 | 快 | 大 | ⚠️ 兼容 |
| RSA 4096 | 4096-bit | ★★★★☆ | 慢 | 很慢 | 中 | 很大 | ⚠️ 高安全 |
| DSS | 1024-bit | ★★☆☆☆ | 快 | 快 | 快 | 中 | ❌ 弃用 |
选择决策
新部署?
├── 是 → Ed25519(首选)
│ └── 需要兼容旧客户端? → 添加 RSA 3072+ 作为备选
│
└── 否 → 已有 RSA 密钥?
├── 是 → 保留,计划迁移到 Ed25519
└── 否 → Ed25519
嵌入式设备推荐
# 生产环境:Ed25519 + RSA 双密钥
dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key
dropbearkey -t rsa -s 3072 -f /etc/dropbear/dropbear_rsa_host_key
# 极简环境:仅 Ed25519(最小化攻击面和存储)
dropbearkey -t ed25519 -f /etc/dropbear/dropbear_ed25519_host_key
8.7 密钥安全最佳实践
密钥存储安全
# 主机密钥权限
sudo chmod 600 /etc/dropbear/dropbear_*_host_key
sudo chown root:root /etc/dropbear/dropbear_*_host_key
# 用户密钥权限
chmod 600 ~/.ssh/id_*
# 验证
ls -la /etc/dropbear/
ls -la ~/.ssh/
密钥轮换自动化
#!/bin/sh
# key_rotation.sh - 自动化密钥轮换
KEY_DIR="/etc/dropbear"
BACKUP_DIR="/etc/dropbear/archived_keys/$(date +%Y%m%d)"
LOG_FILE="/var/log/key-rotation.log"
log() {
echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$LOG_FILE"
echo "$1"
}
# 备份现有密钥
mkdir -p "$BACKUP_DIR"
for key in "$KEY_DIR"/dropbear_*_host_key; do
[ -f "$key" ] && cp "$key" "$BACKUP_DIR/"
done
log "密钥已备份到 $BACKUP_DIR"
# 生成新密钥
for keytype in ed25519 rsa; do
keyfile="$KEY_DIR/dropbear_${keytype}_host_key"
[ -f "$keyfile" ] && rm -f "$keyfile"
dropbearkey -t "$keytype" -s 3072 -f "$keyfile" 2>/dev/null || \
dropbearkey -t "$keytype" -f "$keyfile"
log "已重新生成 ${keytype} 主机密钥"
done
# 显示新指纹
log "=== 新主机密钥指纹 ==="
for keyfile in "$KEY_DIR"/dropbear_*_host_key; do
fp=$(dropbearkey -y -f "$keyfile" 2>&1 | grep Fingerprint | awk '{print $NF}')
log " $(basename $keyfile): $fp"
done
# 重启服务
if command -v systemctl >/dev/null 2>&1; then
systemctl restart dropbear && log "Dropbear 已通过 systemctl 重启"
else
kill -HUP $(cat /var/run/dropbear.pid 2>/dev/null) 2>/dev/null
log "已发送 HUP 信号给 Dropbear"
fi
log "密钥轮换完成"
8.8 与 OpenSSL 工具对比
| 功能 | dropbearkey | ssh-keygen (OpenSSH) |
|---|---|---|
| 生成 RSA | ✅ -t rsa | ✅ -t rsa |
| 生成 Ed25519 | ✅ -t ed25519 | ✅ -t ed25519 |
| 生成 ECDSA | ✅ -t ecdsa | ✅ -t ecdsa |
| 生成 DSA | ✅ -t dss | ✅ -t dsa |
| 密码保护 | ❌ | ✅ -N passphrase |
| 更改密码 | ❌ | ✅ -p |
| 格式转换 | ❌ (用 dropbearconvert) | ✅ -m / -o |
| 签名/验证 | ❌ | ✅ -s / -Y |
| CA 证书 | ❌ | ✅ |
| 公钥提取 | ✅ -y | ✅ -y |
| 指纹显示 | ✅ -y | ✅ -l |
| 批量操作 | ❌ | ❌ |
8.9 业务场景:设备密钥生命周期管理
#!/bin/sh
# device_key_lifecycle.sh - 嵌入式设备密钥生命周期管理
ACTION="$1"
DEVICE="$2"
KEY_DIR="/etc/dropbear"
case "$ACTION" in
generate)
echo "为新设备生成密钥..."
for keytype in ed25519 rsa; do
dropbearkey -t "$keytype" -f "$KEY_DIR/dropbear_${keytype}_host_key"
done
echo "密钥已生成"
;;
fingerprint)
echo "设备主机密钥指纹:"
for keyfile in "$KEY_DIR"/dropbear_*_host_key; do
echo " $(basename $keyfile):"
dropbearkey -y -f "$keyfile" 2>&1 | grep -E "^(ssh-|Fingerprint)"
done
;;
backup)
BACKUP="/tmp/device_keys_$(date +%Y%m%d).tar.gz"
tar czf "$BACKUP" "$KEY_DIR"/dropbear_*_host_key
echo "密钥已备份到 $BACKUP"
;;
rotate)
echo "轮换密钥..."
for keytype in ed25519 rsa; do
keyfile="$KEY_DIR/dropbear_${keytype}_host_key"
[ -f "$keyfile" ] && rm -f "$keyfile"
dropbearkey -t "$keytype" -f "$keyfile"
done
echo "密钥已轮换,请重启 Dropbear"
;;
*)
echo "用法: $0 {generate|fingerprint|backup|rotate} [device]"
;;
esac
8.10 本章小结
| 要点 | 说明 |
|---|---|
| dropbearkey | Dropbear 密钥生成工具,等同 ssh-keygen |
| 推荐算法 | Ed25519 首选,RSA 兼容 |
| 格式转换 | dropbearconvert 在 Dropbear 和 OpenSSH 格式间转换 |
| 公钥兼容 | 公钥格式通用,私钥需要转换 |
| 安全实践 | 定期轮换、限制权限、自动化管理 |
扩展阅读
上一章:SCP 与 SFTP | 下一章:Docker 与容器化 →