在 TLS 通信、数据加密等场景中,安全的密钥是基础保障。openHiTLS 是业界首个面向全场景的开源密码库,由华为、西安电子科技大学、山东大学、上海交通大学等13家国内产学研单位共同发起,提供了完整的密码学和安全通信功能。作为其工具集的一部分,openHiTLS 提供了 hitls genpkey
命令专门用于生成私钥(支持 RSA、EC 两种算法),并可按需输出公钥、用密码保护私钥。
一、工具定位与核心能力
hitls genpkey
是 openHiTLS 工具集中的密钥生成组件,核心作用是通过命令行参数配置,生成符合密码标准的私钥文件,具体包括:
- 算法支持 :仅支持 RSA 和 EC(椭圆曲线) 两种私钥算法;
- 参数配置 :可自定义 RSA 密钥长度(仅支持 1024/2048/3072/4096 位)、EC 曲线类型(需通过
list --all-curves
查看支持列表,如 P-256); - 输出控制:可单独输出私钥,或同时输出公钥(PEM 格式);
- 安全保护:支持通过密码加密私钥(密码可通过明文、文件、环境变量传递);
- 错误校验:对非法参数(如 RSA 长度 1536 位、不支持的 EC 曲线)会直接报错,确保密钥生成合规性。
二、核心命令行选项解析
每个选项的功能、值类型和使用要求如下表所示:
选项名 | 必选性 | 值类型 | 使用说明 |
---|---|---|---|
--help |
否 | 无值 | 输出所有选项的帮助信息,包括功能描述和值类型,新手建议先执行 hitls genpkey --help |
--algorithm |
是 | 字符串 | 指定密钥算法,仅支持 RSA 或 EC (不区分大小写,如 --algorithm rsa 也有效) |
--pkeyopt |
是 | 字符串 | 配置算法专属参数:- RSA 需用 rsa_keygen_bits:长度 (如 rsa_keygen_bits:2048 )- EC 需用 ec_paramgen_curve:曲线名 (如 ec_paramgen_curve:P-256 ) |
--pass |
否 | 字符串 | 私钥加密密码,支持三种格式:- pass:明文 (测试用,如 pass:MyPass123! )- file:路径 (生产用,如 file:./pass.txt )- env:变量名 (生产用,如 env:HITLS_PASS ) |
--pubout |
否 | 文件路径 | 指定公钥输出路径(如 --pubout ec_pub.pem ),不指定则仅生成私钥 |
--out |
是 | 文件路径 | 指定私钥输出路径(如 --out rsa_prv.pem ),必须填写,否则无法生成文件 |
三、实战场景:命令示例与效果
以下所有命令覆盖「基础密钥生成」「带公钥输出」「密码保护私钥」三大核心场景,可直接复制执行(需确保 openHiTLS 环境已部署)。
场景 1:生成基础 RSA 密钥(2048 位)
RSA 是最常用的非对称加密算法,2048 位是兼顾安全性和性能的主流选择。
1.1 仅生成 RSA 私钥
命令:
cpp
hitls genpkey --algorithm RSA --pkeyopt rsa_keygen_bits:2048 --out rsa_2048_prv.pem
执行效果:
- 当前目录生成
rsa_2048_prv.pem
文件,包含未加密的 RSA 私钥(PEM 格式,开头为-----BEGIN PRIVATE KEY-----
); - 若输入
rsa_keygen_bits:1536
(非支持长度),会报错:genpkey: The RSA key length is error, supporting 1024、2048、3072、4096.
。
1.2 同时生成 RSA 私钥 + 公钥
命令:
cpp
hitls genpkey --algorithm RSA --pkeyopt rsa_keygen_bits:2048 --out rsa_2048_prv.pem --pubout rsa_2048_pub.pem
执行效果:
- 新增
rsa_2048_pub.pem
文件,包含 RSA 公钥(PEM 格式,开头为-----BEGIN PUBLIC KEY-----
); - 公钥可用于数据加密(如加密对称密钥)或签名验证,私钥需妥善保管。
场景 2:生成 P-256 曲线 EC 密钥
EC 算法相比 RSA 更轻量化(相同安全性下密钥长度更短),P-256(secp256r1)是 TLS 协议推荐的曲线(可通过 hitls list --all-curves
确认)。
2.1 仅生成 EC 私钥
命令:
cpp
hitls genpkey --algorithm EC --pkeyopt ec_paramgen_curve:P-256 --out ec_p256_prv.pem
执行效果:
- 生成
ec_p256_prv.pem
文件,包含未加密的 P-256 曲线 EC 私钥(PEM 格式,开头为-----BEGIN EC PRIVATE KEY-----
); - 若输入
ec_paramgen_curve:invalid_curve
(不支持的曲线),会报错:genpkey: The EC algorithm parameter ec_paramgen_curve:invalid_curve is incorrect, Use the [list -all-curves] command to view supported curves.
。
2.2 同时生成 EC 私钥 + 公钥
命令:
cpp
hitls genpkey --algorithm EC --pkeyopt ec_paramgen_curve:P-256 --out ec_p256_prv.pem --pubout ec_p256_pub.pem
执行效果:
- 新增
ec_p256_pub.pem
文件,包含 EC 公钥(PEM 格式,开头为-----BEGIN PUBLIC KEY-----
); - EC 公钥体积远小于 RSA 公钥(P-256 公钥仅 65 字节),适合资源受限场景(如物联网设备)。
场景 3:生成带密码保护的私钥(生产环境必备)
未加密的私钥若泄露会直接导致安全风险,生产环境需用密码加密私钥。
3.1 从文件读取密码(推荐,避免明文暴露)
步骤 1:创建密码文件(仅当前用户可读写,防止密码泄露):
cpp
# 写入密码(示例密码:openHiTLS@2025),并设置权限
echo "openHiTLS@2025" > hitls_pass.txt
chmod 600 hitls_pass.txt
步骤 2:生成加密的 RSA 私钥:
cpp
hitls genpkey --algorithm RSA --pkeyopt rsa_keygen_bits:2048 --out rsa_encrypted_prv.pem --pass file:./hitls_pass.txt
执行效果:
- 生成
rsa_encrypted_prv.pem
文件,私钥被密码加密(PEM 格式,开头为-----BEGIN ENCRYPTED PRIVATE KEY-----
); - 后续使用该私钥(如签名、解密)时,需输入密码
OpenHiTLS@2024
才能解密。
3.2 从环境变量读取密码(适合自动化脚本)
步骤 1:设置环境变量(临时生效,脚本结束后自动清除):
cpp
export HITLS_PASS="EC@Secure2025"
步骤 2:生成加密的 EC 私钥:
cpp
hitls genpkey --algorithm EC --pkeyopt ec_paramgen_curve:P-256 --out ec_encrypted_prv.pem --pass env:HITLS_PASS
执行效果:
- 生成加密的 EC 私钥文件,密码从环境变量
HITLS_PASS
读取,避免密码存储在文件中。
四、关键注意事项
- 命令前缀不可省略 :所有操作必须以
hitls genpkey
开头,单独执行genpkey
会因系统无法识别命令而失败; - 私钥权限严格控制 :生成的私钥文件(尤其是未加密的)需执行
chmod 600 私钥文件名
,仅当前用户可读写 ; - 密码格式合规性:密码需包含大小写字母、数字和特殊字符(建议长度 ≥ 8 位);
- 随机数依赖 :确保执行环境有足够的熵源(如 Linux 系统
/dev/urandom
),否则可能导致密钥随机性不足; - 错误排查优先看提示 :每个错误场景都有明确提示(如参数错误、文件权限不足),执行命令失败时,先查看终端输出的错误信息,再针对性解决(如
Extra arguments given
表示命令多了无关参数)。
五、快速查询:常用命令汇总
需求场景 | 完整命令 |
---|---|
查看帮助 | hitls genpkey --help |
生成 2048 位 RSA 私钥 | hitls genpkey --algorithm RSA --pkeyopt rsa_keygen_bits:2048 --out rsa_prv.pem |
生成 P-256 EC 私钥 + 公钥 | hitls genpkey --algorithm EC --pkeyopt ec_paramgen_curve:P-256 --out ec_prv.pem --pubout ec_pub.pem |
密码文件加密 RSA 私钥 | hitls genpkey --algorithm RSA --pkeyopt rsa_keygen_bits:2048 --out rsa_enc_prv.pem --pass file:./pass.txt |
免费下载openHiTLS
1、下载相关代码
- openHiTLS下载地址:https://gitcode.com/openhitls
- libboundscheck下载地址:https://gitee.com/openeuler/libboundscheck.git 说明:需要将libboundscheck下载至openHiTLS/platform/Secure_C目录
2、构建安装,在openHiTLS根路径下执行以下命令:
cppmkdir build cd build cmake .. make && make install