强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Dropbear SSH 完全指南 / 08 - dropbearkey 工具

第八章:dropbearkey 工具

8.1 dropbearkey 概述

dropbearkey 是 Dropbear 套件中的密钥生成和管理工具,功能等同于 OpenSSH 的 ssh-keygen,但专门为 Dropbear 的密钥格式设计。

dropbearkey 命令行语法

dropbearkey -t <密钥类型> -f <密钥文件> [-s <密钥大小>] [-C <注释>]
dropbearkey -y -f <密钥文件>    # 显示公钥信息

选项完整参考

选项参数说明
-ttype密钥类型:rsa, ed25519, ecdsa, dss
-ffilename密钥文件路径
-sbits密钥大小(RSA: 位数,ECDSA: 256/384/521)
-Ccomment密钥注释
-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 特性:

大小曲线安全等级推荐度
256P-256 (secp256r1)~128-bit
384P-384 (secp384r1)~192-bit
521P-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 → OpenSSHOpenSSH → 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 密钥算法对比与选择

完整对比表

算法密钥大小安全等级生成速度签名速度验证速度体积推荐度
Ed25519256-bit★★★★★极快极快极快✅ 首选
ECDSA P-256256-bit★★★★☆✅ 推荐
ECDSA P-384384-bit★★★★☆
RSA 20482048-bit★★★☆☆⚠️ 兼容
RSA 40964096-bit★★★★☆很慢很大⚠️ 高安全
DSS1024-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 工具对比

功能dropbearkeyssh-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 本章小结

要点说明
dropbearkeyDropbear 密钥生成工具,等同 ssh-keygen
推荐算法Ed25519 首选,RSA 兼容
格式转换dropbearconvert 在 Dropbear 和 OpenSSH 格式间转换
公钥兼容公钥格式通用,私钥需要转换
安全实践定期轮换、限制权限、自动化管理

扩展阅读


上一章:SCP 与 SFTP | 下一章:Docker 与容器化