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

将OpenSSL 3.0代码移植到1.1:如何实现EVP_PKEY_Q_keygen等效EC私钥生成

OpenSSL 1.1 中生成EC私钥(等效OpenSSL3.0的EVP_PKEY_Q_keygen)

OpenSSL 1.1 没有 EVP_PKEY_Q_keygen 这类快捷密钥生成函数,要生成可用于CSR的EC私钥,需通过传统的EC_KEY对象流程实现,以下是等效原代码的完整方案:

实现步骤与代码示例

#include <openssl/evp.h>
#include <openssl/ec.h>
#include <openssl/err.h>

EVP_PKEY* generate_ec_pkey_prime256v1(void) {
    EVP_PKEY *pkey = NULL;
    EC_KEY *ec_key = NULL;

    // 1. 创建EC_KEY对象并指定prime256v1曲线(对应OpenSSL内置NID)
    ec_key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
    if (ec_key == NULL) {
        ERR_print_errors_fp(stderr);
        goto cleanup;
    }

    // 2. 生成EC密钥对
    if (!EC_KEY_generate_key(ec_key)) {
        ERR_print_errors_fp(stderr);
        goto cleanup;
    }

    // 3. 将EC_KEY包装为EVP_PKEY对象(适配CSR相关API要求)
    pkey = EVP_PKEY_new();
    if (pkey == NULL || !EVP_PKEY_assign_EC_KEY(pkey, ec_key)) {
        ERR_print_errors_fp(stderr);
        EC_KEY_free(ec_key); // 包装失败时手动释放EC_KEY
        pkey = NULL;
        goto cleanup;
    }
    // 注意:EVP_PKEY_assign_EC_KEY会接管EC_KEY的内存,后续只需释放pkey即可

cleanup:
    return pkey;
}

关键说明

  • 原代码指定的prime256v1曲线,在OpenSSL 1.1中对应内置宏NID_X9_62_prime256v1,直接用该NID即可创建对应曲线的EC_KEY对象。
  • 生成密钥对后必须转换为EVP_PKEY类型,因为OpenSSL创建CSR的X509_REQ_set_pubkey等API仅接受EVP_PKEY对象。
  • 错误处理用ERR_print_errors_fp打印OpenSSL内部错误,方便调试定位问题。
  • 内存管理:EVP_PKEY_assign_EC_KEY会让EVP_PKEY接管EC_KEY的所有权,后续仅需调用EVP_PKEY_free(pkey)即可同时释放EC_KEY,无需单独释放ec_key。

私钥用于CSR创建的参考流程

生成的EVP_PKEY可直接用于CSR构建,示例片段:

X509_REQ *req = X509_REQ_new();
// 设置CSR主题信息
X509_NAME *name = X509_NAME_new();
X509_NAME_add_entry_by_txt(name, "CN", MBSTRING_ASC, (unsigned char*)"example.com", -1, -1, 0);
X509_REQ_set_subject_name(req, name);
// 绑定公钥到CSR
X509_REQ_set_pubkey(req, pkey);
// 用私钥签名CSR
X509_REQ_sign(req, pkey, EVP_sha256());
// 后续可将CSR编码输出或存储

内容的提问来源于stack exchange,提问作者IanPudney

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:15:47