iOS开发之编译OpenSSL静态库

这篇具有很好参考价值的文章主要介绍了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

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

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

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

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

mkdir openssl_arm64 openssl_armv7 openssl_x86_64 openssl_lib

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

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

注意:

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文件,如图所示:

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

第四步:

打开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:

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

OpenSSL-1.1.1u: 

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

第六步:

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

make install

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

OpenSSL-1.0.2u:

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

OpenSSL-1.1.1u: 

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

第七步:

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

如图所示:

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

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

ios 集成openssl,iOS开发等常用知识点,OpenSSL1.0.2,OpenSSL1.1.1,libssl.a,libscypto.a

关于使用脚本代码编译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,以上信息已经整理完毕,整理不易,转载请注明,谢谢~文章来源地址https://www.toymoban.com/news/detail-723969.html

到了这里,关于iOS开发之编译OpenSSL静态库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编译安装openssl及安装完openssl后使用 ssh -V 查看依然是旧版openssl原因

    Centos升级openssh8.8p1 1. 下载安装wget 2. 获取openssl源码包 3. 安装openssl 所需依赖 4. 解压编译openssl 5. 替换旧版openssl 6. 查看openssl版本 注: 安装完openssl后使用 ssh -V 查看依然是旧版openssl, 是因为openssh是rpm/yum安装的调用的openssl依旧是旧版,不影响使用。 如果看不顺眼可以编译升

    2024年02月16日
    浏览(58)
  • Ubuntu20.04与22.04 openssl与openssl编译安装

    操作系统openssl版本查看: 推荐根据操作系统默认版本下载对应修复版本 ubuntu20.04 openssl版本:OpenSSL 1.1.1f ubuntu22.04 openssl版本:OpenSSL 3.0.2 首先,使用 wget 命令下载 OpenSSL 的源代码压缩包。从 OpenSSL 官方网站上找到最新版本的源代码。 如下以ubuntu20.04示例: 解压源代码 使用

    2024年02月06日
    浏览(65)
  • nginx在编译时找不到openssl,通过手动方式指定openssl路径

    1、报错让我安装openssl,或者制定openssl源码路径 2、离线安装一个openssl源码包 1、从官网下载一个openssl源码包,给它放到自己指定的一个目录里 2、解压openssl包 tar -zxvf openssl-1.1.1f.tar.gz 3、 进入nginx源码包安装目录,重新编译,指定openssl路径

    2024年02月11日
    浏览(47)
  • iOS开发集成framework、Bundle文件获取

    有些时候,我们开发的SDK并不需要对外隐藏,那么就可以将源码都打包给对方,也可以集成cocopods仓库,供外部使用。但有些时候,出于版权等原因,我们提供的代码只希望对方能够正常使用,却不希望对方看到内部的实现细节,就像苹果官方一样,给我们开发者提供的API只

    2024年02月12日
    浏览(34)
  • openssl交叉编译 (ubuntu+arm)

    1.下载安装包  wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz 2.解压安装包 tar -zxvf openssl-1.1.1l.tar.gz 3.进入源码文件夹-修改编译器 CC=arm-linux-gnueabihf-gcc 4.配置编译参数 ./config no-asm -shared --prefix=/home/alientek/sp_test/openssl/sp_install 1)no-asm在交叉编译过程中不使用汇编代码代码加速编译

    2024年02月05日
    浏览(46)
  • 交叉编译arm程序,编译arm版本的openssl

    开局一个错: 显示没有GCC, 于是下载gcc; 下载gcc有问题: 发现是换源的问题,于是换源后继续安装,安装成功: 接着继续出错: 继续安装库sudo apt-get install libncurses5-dev 接着又报错了,我之前去的github上弄的buildroot,现在去官网下载一个。 果然运行成功了: Target options:

    2024年02月04日
    浏览(41)
  • 鸿蒙引入 OpenSSL 库和 Poco 库(编译、调用)

    从 openHarmony SDK 官方发布渠道下载 SDK。 我下载的版本是 version-Master_Version-OpenHarmony_4.1.6.5_dev-20240127_020213-ohos-sdk-full.tar.gz 解压 SDK,得到 ohos_sdk 目录。可以看到 Linux 和 windows 两个平台的 SDK 目录,我们进入 Linux 目录。 解压 Linux 环境下的 OHOS SDK 工具包,得到对应工具目录。由

    2024年04月10日
    浏览(42)
  • 无openssl编译libwebsockets源码(关闭SSL)

    编译源码,生成不依赖openssl的libwebsockets动态库(dll),操作系统为64位win10,需要提供32位的兼容版本。 选择libwebsockets版本为4.3,编译器为VS2017默认编译器,cmake3.26。 在cmake阶段通过LWS_WITH_SSL变量关闭libwebsockets的所有SSL功能。 0、安装cmake(略)。 1、在源代码main目录下(与i

    2024年02月14日
    浏览(38)
  • HarmonyOS编译开源native库(OpenSSL实例)

    近期项目要开始做鸿蒙版本,有一部分依赖native的代码也需要迁移,某个native模块依赖openssl,需要在鸿蒙下重新编译openssl才行。一开始找了很多相关文档都没有得到方法,无奈只能自己凭经验慢慢试,最后还是成功了。 https://gitee.com/openharmony/docs/tree/master/zh-cn/release-notes#op

    2024年02月02日
    浏览(36)
  • 常用的openssl命令

    一、使用openssl生成MD5哈希:        二、使用openssl生成sha1哈希:          三、使用openssl生成SHA256哈希:               如果直接执行命令:      得到的结果是:gQ/y+yQqXe5CIPLLDmpRmJH7Z/L4KKbKtO+IlGM7H1A=, 由于/ + 和=在URL中都有特殊的含义,所以,当把它作为URL中的一部分时

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包