为何OpenSSL 3.0+下‘RSA_size’等函数报C4996错误?如何解决?
错误原因
- OpenSSL 3.0起正式废弃了一批旧的算法特定API(如
RSA_size这类直接操作RSA对象的函数),并将它们标记为弃用(deprecated)。 - Visual Studio的C4996错误默认会将调用弃用函数的行为触发为编译错误,而非警告,这就是报错的直接原因。
- 你的代码仍在使用OpenSSL 3.0已弃用的旧接口,且项目配置未针对这种弃用做特殊处理。
解决方法
推荐方案:迁移到OpenSSL 3.0通用EVP接口
OpenSSL 3.0推荐使用通用的EVP加密接口替代原有的算法特定函数,这类接口兼容性更强,也更符合后续版本的迭代方向。以RSA_size为例:
// 旧代码(触发错误) RSA* rsa_key = ...; int key_size = RSA_size(rsa_key); // 新代码(使用EVP接口) EVP_PKEY* pkey = EVP_PKEY_new(); // 将RSA对象关联到EVP_PKEY(若已有EVP_PKEY则跳过此步) EVP_PKEY_assign_RSA(pkey, rsa_key); int key_size = EVP_PKEY_get_size(pkey);
所有类似RSA_*、DSA_*的算法特定函数,都可以替换为对应的EVP_PKEY_*系列接口。
临时过渡方案:禁用弃用警告
如果暂时无法迁移代码,可以通过以下方式禁用C4996错误:
- 项目设置层面:右键项目 → 属性 → C/C++ → 常规 → 禁用特定警告,添加
4996。 - 代码层面:在包含OpenSSL头文件前定义宏,抑制弃用提示:
#define OPENSSL_SUPPRESS_DEPRECATED #include <openssl/rsa.h> // 其他OpenSSL头文件
⚠️ 注意:此方案仅为临时过渡,依赖弃用函数的代码在未来OpenSSL版本中可能完全无法编译。
版本宏配置检查
确保代码中正确设置了OpenSSL的版本兼容宏,避免错误引入旧API:
在包含OpenSSL头文件前添加以下宏定义,指定兼容OpenSSL 3.0及以上版本:
#define OPENSSL_API_COMPAT 0x30000000L #include <openssl/evp.h>
该宏会控制头文件中仅暴露指定版本及以上的API,减少误调用弃用函数的可能。
内容的提问来源于stack exchange,提问作者ido
相关产品推荐
相关产品推荐

