You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:12:54