MacOS编译OpenSSL 1.1.0h时i2c_ASN1_INTEGER函数未定义求助
解决OpenSSL 1.1.0h中
i2c_ASN1_INTEGER未公开的问题 你遇到的问题本质是:i2c_ASN1_INTEGER是OpenSSL 1.1.0h的内部私有函数——它定义在asn1_locl.h(内部头文件)和a_int.c中,并没有被暴露在对外的公共API里,所以编译时会提示未定义。苹果内购收据验证的示例代码可能是基于更早版本的OpenSSL(比如1.0.x系列,该函数当时是公开的)编写的,因此默认它存在。
下面给你几个可行的解决方案,按推荐程度排序:
1. 用公开API实现替代函数(最推荐)
i2c_ASN1_INTEGER的核心功能是将ASN1_INTEGER对象序列化为DER格式的字节流,并返回长度。你可以用OpenSSL公开的ASN1_INTEGER_length和ASN1_INTEGER_put函数完全复刻这个逻辑,这两个函数在公共头文件openssl/asn1.h中有声明,兼容性有保障。
在你的代码中添加以下自定义函数:
int my_i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp) { int len = ASN1_INTEGER_length(a); if (!pp) return len; unsigned char *p = *pp; ASN1_INTEGER_put(p, a); *pp += len; return len; }
然后把所有调用i2c_ASN1_INTEGER的地方替换为my_i2c_ASN1_INTEGER即可。
2. 临时手动声明函数(不推荐,仅应急)
如果你只是想快速跑通示例代码,可以在你的源文件顶部手动声明这个函数:
// 仅临时应急,不推荐长期使用 int i2c_ASN1_INTEGER(ASN1_INTEGER *a, unsigned char **pp);
但要注意:这个方法依赖OpenSSL内部函数的导出状态,不同版本或编译配置下可能失效,而且后续升级OpenSSL时大概率会出问题。
3. 调整OpenSSL版本
- 降级到1.0.x系列:如果你的项目对版本兼容性要求不高,1.0.x版本中
i2c_ASN1_INTEGER是公开的,可以直接使用示例代码,但1.0.x已经停止维护,安全性没有保障。 - 升级到1.1.1+版本:1.1.1系列是长期支持版本,修复了很多漏洞,同时你可以检查是否有更合适的公开API替代原逻辑,或者看看苹果内购验证的最新实现方式。
重要提醒
绝对不要尝试包含内部头文件asn1_locl.h,它是OpenSSL的私有实现文件,不同版本结构差异极大,编译时可能找不到,而且链接时会因为内部符号未导出而报错。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

