将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
相关产品推荐
相关产品推荐

