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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:00:05