OpenSSL 1.0.2n迁移至1.1.1k无法访问X509结构体如何解决
OpenSSL 1.1.1k 版本X509结构体成员访问方案
OpenSSL从1.1.0版本开始将绝大多数核心结构体设置为不透明类型,禁止直接访问成员,所有读写操作都需要使用官方提供的公开API完成。你要访问的certificate->cert_info->signature->algorithm对应的替代方案如下:
1. 直接替换原有判断逻辑
你原来的三级指针判断可以直接用X509_get0_tbs_sigalgAPI替换,该函数会直接返回TBS证书中的签名算法结构体指针,返回非空即等价于你原有三级判断的全部条件为真:
// 替换原有if判断代码 const X509_ALGOR *sig_alg = X509_get0_tbs_sigalg(certificate); if (sig_alg != NULL) { // 此处放你原来的业务逻辑 }
2. 访问签名算法的具体属性
如果后续你需要获取算法标识等信息,可以使用X509_ALGOR_get0API读取结构体内容:
const ASN1_OBJECT *alg_id = NULL; // 函数参数依次为:算法标识指针地址、参数类型指针地址、参数值指针地址、输入的X509_ALGOR指针 X509_ALGOR_get0(&alg_id, NULL, NULL, sig_alg); // 示例:将算法标识转换为NID做后续判断 int alg_nid = OBJ_obj2nid(alg_id); if (alg_nid == NID_sha256WithRSAEncryption) { // 对应业务逻辑 }
注意事项
- 所有前缀带
get0的API返回的都是OpenSSL内部托管的指针,你不需要手动释放,禁止调用OPENSSL_free释放这类指针 - 其他X509结构体成员的访问都可以在OpenSSL 1.1.1官方API文档中找到对应的get/set函数,不要尝试强制类型转换访问不透明结构体的内存布局,避免版本兼容性问题
- 编译时请确保头文件引用和链接库都是1.1.1k版本,避免和系统自带的旧版OpenSSL冲突
内容的提问来源于stack exchange,提问作者carraro
相关产品推荐
相关产品推荐

