项目审查发现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,以上信息已经整理完毕,整理不易,转载请注明,谢谢~