iOS开发之编译OpenSSL静态库

项目审查发现OpenSSL1.0.2d有漏洞,所以需要升级更新OpenSSL版本,借此机会,记录一下编译OpenSSL静态库的流程。

Xcode使用的是14.2,OpenSSL使用的是1.0.2u、1.1.1u,由于是对两个不同版本进行的编译操作,所以相关命令和操作方式是有区别的,我会在下面分别描写,操作时要看清对应的步骤,以防编译出的包有问题。

第一步:

打开OpenSSL官网/source/index.html,找到GitHub地址:https://github.com/openssl/openssl,并下载对应版本的源码到本地。

注意:源码是有很多分支和tag的,如果是替换,最好是选择同一个版本下的源码,否则编出的静态库,替换后很有可能会报错,找不到对应头文件或者相关方法。

第二步:

1、如果你使用的是OpenSSL-1.0.2u源码:

解压文件,打开源码文件夹的终端窗口,创建文件夹,执行命令:

mkdir openssl_armv7

此时会在源码目录中生成对应的文件夹,如图所示:

2、如果你使用的是OpenSSL-1.1.1u源码:

解压文件,打开源码文件夹的终端窗口,创建文件夹,执行命令:

mkdir openssl_arm64 openssl_armv7 openssl_x86_64 openssl_lib

此时会在源码目录中生成对应的文件夹,如图所示:

注意:

iPhoneOS真机架构:arm64、armv7、armv7s

iPhoneSimulator模拟器架构:x84_64、i386

因为我之前的静态库是支持arm64、armv7、x86_64的,所以这里也只是对这些架构进行的操作,其他的应该也能同理使用。

第三步:

生成配置文件,执行命令:

# no-asm:不使用arm指令集
# 其实这个值,我也比较模糊,no-asm是在交叉编译过程中不使用汇编代码,加速编译过程,
# 原因是它的汇编代码是对arm格式不支持的,
# 但是我在编译arm64、armv7时也是没有问题的,有点奇怪。
# -shared:编译动态库和静态库
# no-shared:只编译静态库

./Configure iphoneos-cross no-asm no-shared --prefix=
(刚才生成的文件夹地址,可以将文件夹直接拖拽到此处,直接生成地址)

# 上面的命令行,其实是可以添加参数的,比如:我遇到了Undefined Symbol "ssl3-method",
# 未定义的方法元素符号,于是我在地址前添加了enable-ssl3 enable-ssl3-method参数后,
# 相关方法得以链接到生成的静态库中,其实配置的参数很多,可以将Configure终端窗口进行
# 文本展示,然后看里面的参数描述,进行参数添加,从而生成符合的对应静态库

此时会在源码文件夹下生成Makefile文件,如图所示:

第四步:

打开Makefile文件,修改CC=、CFLAG(S)= 参数,添加CROSS_TOP、CROSS_SDK参数值;

注意、注意、注意:如果想要生成的是模拟器架构:x84_64、i386,要记的将iPhoneOS全部替换成iPhoneSimulator

1、如果你使用的是OpenSSL-1.0.2u源码:

# 找到CC= llvm-gcc,替换以下代码:参数值其实是Xcode中clang指令的地址
CC= /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7(写入对应的指令集arm64/armv7/x86_64等)

# 接着上面的参数,向下一两行,找到CFLAG=,在此参数上添加CROSS_TOP 和 CROSS_SDK
CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer # Xcode下iPhoneOS平台地址
CROSS_SDK=iPhoneOS.sdk # iPhoneOS平台下的sdk

# 作为iOS开发,上面的地址应该很熟悉,很容易的就能找到

2、如果你使用的是OpenSSL-1.1.1u源码:

# 找到CC= $(CROSS_COMPILE)cc,替换以下代码:参数值其实是Xcode中clang指令的地址
CC= /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -arch armv7(写入对应的指令集arm64/armv7/x86_64等)

# 接着上面的参数,向下一两行,找到CFLAGS=-O3,替换以下代码:
# Xcode下iPhoneOS平台地址
CROSS_TOP=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer 
# iPhoneOS平台下的sdk
CROSS_SDK=iPhoneOS.sdk 
# 配置地址
CFLAGS=-DDSO_DLFCN -DHAVE_DLFCN_H -DNDEBUG -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC -DOPENSSLDIR="\"$(OPENSSLDIR)\"" -DENGINESDIR="\"$(ENGINESDIR)\"" -O3 -D_REENTRANT -isysroot $(CROSS_TOP)/SDKs/$(CROSS_SDK) -fno-common       

第五步:

将Makefile配置完成后,执行命令:

make

然后会在源码文件夹下生成libssl.a、libcrypto.a,如图所示:

OpenSSL-1.0.2u:

OpenSSL-1.1.1u: 

第六步:

此时会发现之前创建的架构文件夹还是空的,没有任何东西,此时执行命令:

make install

 执行完成后,再查看对应的文件夹,会发现东西已经生成完成,如图所示:

OpenSSL-1.0.2u:

OpenSSL-1.1.1u: 

第七步:

1、如果你使用的是OpenSSL-1.0.2u源码:

此时一个架构对应的libssl.a、libcrypto.a静态库和头文件已经生成,此时你需要把对应的架构文件夹,如openssl_arm64,放到一个自定义的文件夹下,当然也可以直接放到源码文件夹的上层文件夹下,然后删除源码文件夹,重新解压下载的OpenSSL源码压缩包,开始编译其他架构下的静态库,从第二步开始执行,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,重要的事说三遍!!!(记得要把生成的静态库都放在同一个文件夹下)

2、如果你使用的是OpenSSL-1.1.1u源码:

执行命令:

make clean

然后从第三步开始编译其他架构下的静态库,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,一定要注意修改对应的架构名称,重要的事说三遍!!!

最后,当所有架构的静态库都已经生成完成后,我们需要将不同的libssl.a、libcrypto.a生成同一个.a库,在和各个架构文件夹同级的目录下创建一个输出文件夹,如:openssl_lib,打开上级文件夹的终端窗口,执行命令:

# 合并libssl.a
lipo -create openssl_arm64/lib/libssl.a openssl_armv7/lib/libssl.a openssl_x86_64/lib/libssl.a -output openssl_lib/libssl.a 

# 合并libcrypto.a
lipo -create openssl_arm64/lib/libcrypto.a openssl_armv7/lib/libcrypto.a openssl_x86_64/lib/libcrypto.a -output openssl_lib/libcrypto.a 

这样就会在openssl_lib文件夹下生成两个合并好的libssl.a、libcrypto.a,打开openssl_lib文件夹下的终端窗口,查看合并的架构信息:

# 查看合并的架构信息
lipo -info libcrypto.a
lipo -info libssl.a

如图所示:

此时将任意一个架构文件夹中的include文件夹添加到openssl_lib文件夹下,这样一个完整的OpenSSL静态库就生成了!如图所示:

关于使用脚本代码编译OpenSSL静态库的方式,暂时没有可用的办法,如果后续研究出来,会继续记录,供大家参考。(后来我研究了一个脚本方式,但是总感觉生成的东西不太保险,所以这里我就不再进行记录和描述了)

2023.9.18更新:

使用上面的Xcode14.2编译出的OpenSSL,在iPhone7,系统版本:13.1.2;iPhone6,系统版本:12.5.7,调用int RSA_public_encrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding)方法时,会出现崩溃现象,猜测可能是因为Xcode版本太高,造成编译出的包缺少了相关函数或者系统库等,然后1、尝试下载Xcode13.1、Xcode12.4重新编译OpenSSL,发现依然有此问题,2、于是又下载了Xcode10.1、Xcode11.1,这两个版本的IDE都无法使用,总是显示没有命令行工具,配置下载完后还是会提示相同的问题无法使用,可能是因为高系统版本的Mac无法完成这些安装配置,3、感觉都要不行了,进行了最后的尝试下载了Xcode11.7,编译成功,崩溃问题终于被解决了,果然坚持就是胜利,差点儿就要放弃,努力总会有收获的,铁子们加油!!!

OK,以上信息已经整理完毕,整理不易,转载请注明,谢谢~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hbblzjy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值