【密码学实战】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
相关推荐
openHiTLS密码开源社区4 天前
【密码学实战】openHiTLS X509命令行工具: 数字证书生成与转换
https·数字证书·x509·csr·公钥·私钥·自签名
Humbunklung8 天前
填坑:VC++ 采用OpenSSL 3.0接口方式生成RSA密钥
开发语言·c++·rsa·openssl 3.0
Humbunklung8 天前
C# 使用应用RSA和ECC进行数字签名和签名验证
开发语言·c#·rsa·ecc
一只游鱼13 天前
RSA非对称加密
非对称加密·rsa
qqxhb24 天前
系统架构设计师备考第20天——信息加解密技术&密钥管理技术
系统架构·des·aes·加解密·rsa·密钥管理·kdc
openHiTLS密码开源社区1 个月前
scrypt 密钥派生算法(RFC7914)技术解析及源码示例
scrypt·openhitls·密钥派生算法·内存密集型算法·开源密码库
bkspiderx1 个月前
安全扫描:目标主机支持RSA密钥交换问题
网络·nginx·安全·tls·rsa·弱算法
openHiTLS密码开源社区1 个月前
数字安全隐形基石:随机数、熵源与DRBG核心解析与技术关联
密码学·随机数·openhitls·熵源·drbg
小韩博2 个月前
metasploit 框架安装更新遇到无法下载问题如何解决
linux·网络安全·公钥·下载失败