【密码学实战】openHiTLS genpkey命令行:生成 RSA/EC密钥的正确姿势

在 TLS 通信、数据加密等场景中,安全的密钥是基础保障。openHiTLS 是业界首个面向全场景的开源密码库,由华为、西安电子科技大学、山东大学、上海交通大学等13家国内产学研单位共同发起,提供了完整的密码学和安全通信功能。作为其工具集的一部分,openHiTLS 提供了 hitls genpkey 命令专门用于生成私钥(支持 RSA、EC 两种算法),并可按需输出公钥、用密码保护私钥。

一、工具定位与核心能力

hitls genpkey 是 openHiTLS 工具集中的密钥生成组件,核心作用是通过命令行参数配置,生成符合密码标准的私钥文件,具体包括:

  1. 算法支持 :仅支持 RSAEC(椭圆曲线) 两种私钥算法;
  2. 参数配置 :可自定义 RSA 密钥长度(仅支持 1024/2048/3072/4096 位)、EC 曲线类型(需通过 list --all-curves 查看支持列表,如 P-256);
  3. 输出控制:可单独输出私钥,或同时输出公钥(PEM 格式);
  4. 安全保护:支持通过密码加密私钥(密码可通过明文、文件、环境变量传递);
  5. 错误校验:对非法参数(如 RSA 长度 1536 位、不支持的 EC 曲线)会直接报错,确保密钥生成合规性。

二、核心命令行选项解析

每个选项的功能、值类型和使用要求如下表所示:

选项名 必选性 值类型 使用说明
--help 无值 输出所有选项的帮助信息,包括功能描述和值类型,新手建议先执行 hitls genpkey --help
--algorithm 字符串 指定密钥算法,仅支持 RSAEC(不区分大小写,如 --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 读取,避免密码存储在文件中。

四、关键注意事项

  1. 命令前缀不可省略 :所有操作必须以 hitls genpkey 开头,单独执行 genpkey 会因系统无法识别命令而失败;
  2. 私钥权限严格控制 :生成的私钥文件(尤其是未加密的)需执行 chmod 600 私钥文件名,仅当前用户可读写 ;
  3. 密码格式合规性:密码需包含大小写字母、数字和特殊字符(建议长度 ≥ 8 位);
  4. 随机数依赖 :确保执行环境有足够的熵源(如 Linux 系统 /dev/urandom),否则可能导致密钥随机性不足;
  5. 错误排查优先看提示 :每个错误场景都有明确提示(如参数错误、文件权限不足),执行命令失败时,先查看终端输出的错误信息,再针对性解决(如 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、下载相关代码

2、构建安装,在openHiTLS根路径下执行以下命令:

cpp 复制代码
mkdir build
cd build
cmake ..
make && make install
相关推荐
Mr -老鬼1 天前
EasyClick 全平台公开问题解决方案全集(2026最新完整版)
自动化·ec·easyclick·易点云测
Mr -老鬼7 天前
EasyClick iOS版 CLI 与 Trae iOS版智能体
ios·自动化·ai编程·tare·ec·easyclick·易点云测
Java后端的Ai之路9 天前
SSH配置与GitHub项目拉取操作指南
elasticsearch·ssh·github·公钥
aovenus15 天前
RSA 算法介绍
rsa
酿情师21 天前
2026软件系统安全赛初赛RSA(赛后复盘)
android·网络·安全·密码学·rsa
温中志25 天前
RSA加密算法入门
rsa·计算机密码学
GitCode官方1 个月前
openHiTLS密码模块获商用密码产品与ISO 19790双认证,开源安全迎来新里程碑
安全·openhitls
openHiTLS密码开源社区1 个月前
【重磅】openHiTLS密码模块获商用密码产品与ISO19790双认证,开源安全迎来新里程碑
openhitls·商用密码产品认证·iso 19790·软件密码模块·国密一级
Y5neKO1 个月前
某国赛CTF密码学题目Writeup:RSA
密码学·ctf·rsa
Mr -老鬼1 个月前
EasyClick 热更新坑点处理方案
自动化·ec·easyclick·易点云测