OpenSSL 1.1.0版本中X509结构体name字段位置及迁移适配问题
OpenSSL 1.0.2 迁移到1.1.0 X509 name字段缺失适配方案
OpenSSL 从1.1.0版本开始将所有核心结构体改为不透明类型,不再允许直接访问内部成员,原1.0.2版本X509结构体中的name字段是内部缓存的证书主体(Subject)可读字符串,已经被正式移除,你可以使用官方提供的公共API替换原有cert->name写法:
适配代码示例
// 原有1.0.2版本写法 // char *cert_name = cert->name; // 1.1.0及以上版本替换写法 char *cert_name = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0); // 业务逻辑正常使用cert_name... // 用完后必须手动释放内存,避免泄漏 OPENSSL_free(cert_name);
补充说明
- 如果你需要获取的是证书签发者(Issuer)的名称,只需要将上述代码中的
X509_get_subject_name替换为X509_get_issuer_name即可。 X509_NAME_oneline返回的字符串格式和1.0.2版本name字段的存储格式完全一致,不会产生兼容性问题。- 所有直接访问OpenSSL结构体成员的写法在1.1.0+版本都需要替换为对应的get/set公共API,这是跨版本迁移的通用规则。
- 如果需要兼容两个版本,可以用宏判断封装逻辑:
char *get_x509_subject_name(X509 *cert) { #if OPENSSL_VERSION_NUMBER < 0x10100000L // 1.0.2版本逻辑,用OPENSSL_strdup保证内存分配接口统一 return OPENSSL_strdup(cert->name); #else return X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0); #endif } // 调用方用完统一调用OPENSSL_free释放即可
内容的提问来源于stack exchange,提问作者shingo
相关产品推荐
相关产品推荐

