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

OpenSSL 3.0中替代旧函数从RSA密钥PEM创建EVP_PKEY的方法

OpenSSL 3.0+ 从PEM格式RSA密钥生成EVP_PKEY的替代方案

在将OpenSSL v1.1.1客户端代码移植到3.0及以上版本时,原代码依赖的PEM_read_bio_RSAPrivateKey/PEM_read_bio_RSAPublicKey和EVP_PKEY_assignRSA函数已被弃用,可通过以下统一接口实现相同功能:

OpenSSL 3.0引入了统一的密钥加载接口,无需手动处理RSA结构体,直接从PEM内容生成EVP_PKEY,同时兼容新的提供者架构。

加载PEM格式RSA私钥

#include <openssl/pem.h>
#include <openssl/evp.h>

EVP_PKEY* load_rsa_private_key(BIO *bio) {
    // 直接从BIO加载PEM私钥为EVP_PKEY
    EVP_PKEY *pkey = PEM_read_bio_PrivateKey(bio, NULL, NULL, NULL);
    
    // 可选:验证加载的密钥是否为RSA类型
    if (pkey != NULL && EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA) {
        EVP_PKEY_free(pkey);
        return NULL;
    }
    
    return pkey;
}

加载PEM格式RSA公钥

EVP_PKEY* load_rsa_public_key(BIO *bio) {
    // 直接从BIO加载PEM公钥为EVP_PKEY
    EVP_PKEY *pkey = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL);
    
    // 可选:验证加载的密钥是否为RSA类型
    if (pkey != NULL && EVP_PKEY_base_id(pkey) != EVP_PKEY_RSA) {
        EVP_PKEY_free(pkey);
        return NULL;
    }
    
    return pkey;
}

关键说明

  • PEM_read_bio_PrivateKey和PEM_read_bio_PUBKEY会自动识别PEM中的密钥类型,无需指定算法,符合OpenSSL 3.0的抽象密钥设计。
  • 生成的EVP_PKEY可直接用于加密、签名、验签等所有EVP层操作,与旧版代码的使用逻辑完全兼容。
  • 使用完毕后必须调用EVP_PKEY_free()释放密钥资源,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 03:23:15