求助:将OpenSSL1.1.1i的EC/RSA私钥DER编码代码移植到3.0.8
OpenSSL 3.0.8中获取EC/RSA私钥DER编码字节的替代方案
OpenSSL 3.x废弃了1.1.1版本中直接操作EC_KEY/RSA结构体的编码函数,改用OSSL_ENCODER统一框架处理密钥编码,无需再区分密钥类型,代码更简洁且符合新版本规范。以下是替代原逻辑的实现:
完整替代代码
EVP_PKEY *privateKey; uint8_t *tmp = NULL; size_t len = 0; privateKey = ... // 已加载的有效私钥 // 创建编码器上下文,指定输出为DER格式的私钥 OSSL_ENCODER_CTX *ctx = OSSL_ENCODER_CTX_new_for_pkey(privateKey, OSSL_KEYMGMT_SELECT_PRIVATE_KEY, "PrivateKey", "DER", NULL); if (ctx != NULL) { // 将编码结果写入tmp,自动分配内存 if (OSSL_ENCODER_to_data(ctx, (void **)&tmp, &len)) { // ... do stuff with tmp(原逻辑的处理代码) OPENSSL_free(tmp); // 释放编码后的内存 } OSSL_ENCODER_CTX_free(ctx); // 释放编码器上下文 }
关键说明
- OSSL_ENCODER_CTX_new_for_pkey:为指定的EVP_PKEY创建编码器上下文,
OSSL_KEYMGMT_SELECT_PRIVATE_KEY表示选择私钥部分进行编码。 - 输出参数:
"PrivateKey"指定编码对象为私钥,"DER"指定编码格式,这两个参数对应原逻辑中i2d_ECPrivateKey和i2d_RSAPrivateKey的功能。 - 内存管理:
OSSL_ENCODER_to_data会自动为tmp分配内存,使用完成后必须用OPENSSL_free释放;编码器上下文用OSSL_ENCODER_CTX_free释放。 - 兼容性:该代码同时支持EC和RSA密钥,无需再通过
EVP_PKEY_id判断密钥类型,简化了分支逻辑。
错误排查补充
如果编码失败,可调用ERR_print_errors_fp(stderr)打印OpenSSL错误信息,帮助定位具体问题。
内容的提问来源于stack exchange,提问作者Shaun Botha
相关产品推荐
相关产品推荐

