OpenSSL 1.1.1的裁剪

简介: OpenSSL这个库,对于一个端上的sdk来说,算是一个比较大的库了,这里拿OpenSSL1.1.1在Android arm64来做说 全编译后libcrypto.a 4.7M, libssl.a 900多k,当然strip后会变小,我们这里就拿没strip的库来做大小对比 首先百度,Google, GitHub找一些别人裁剪的脚本进行尝试,有些是因为版本不一样,所以出错了,去掉不支持的选

OpenSSL这个库,对于一个端上的sdk来说,算是一个比较大的库了,这里拿OpenSSL1.1.1在Android arm64来做说
全编译后libcrypto.a 4.7M, libssl.a 900多k,当然strip后会变小,我们这里就拿没strip的库来做大小对比

首先百度,Google, GitHub找一些别人裁剪的脚本进行尝试,有些是因为版本不一样,所以出错了,去掉不支持的选项后,编译或链接的时候会失败,并且每个地方搜到的脚本并不太一样,也不见得符合我们的需求。
说下我们的需求,我们使用OpenSSL主要是用来在curl中支持https协议,并且其他地方有用到md5的计算和aes的加解密算法,如果你和我们的需求差不多,那么我们可以一起往下看了。

在搜索脚本使用失败后,被逼无奈,找找OpenSSL的源码里面有没有相关的说明不?还真找到了
请一起看源码里面的INSTALL文件,里面有裁剪相关的说明
这里面应该是有几类裁剪
首先是直接列出来名字的,如:

no-afalgeng no-async no-autoalginit no-autoerrinit ...

当然,这里的选项并不都是裁剪模块相关的,比如

no-pic no-shared

这里的是编译选项,no-pic是无法编译成动态库,no-shared是不编译动态库,这里要根据自己的需求选择了。如果你想编译成动态库,或者把静态库最终链接成动态库no-pic是不能选择的。

no-threads  Don't try to build with support for multi-threaded
                   applications.

是不使能多线程安全相关代码,我们升级到1.1.1的目的就是要使用其内部的线程安全功能,所以这个也不能选。

no-sock Don't build support for socket BIOs,

这个我们也不要选,这个是https中需要的。

这里面还有一个特殊的选项

  no-deprecated
                   Don't build with support for any deprecated APIs. This is the
                   same as using "--api" and supplying the latest version
                   number.

是不编译过时的api,请不要使用这个选项,如果加上会导致一些其他软件的链接问题,比如ffmpeg3.4中,使用了一些比较低版本的接口,如果加上这个选项,会导致ffmpeg编译不过,我看了下,这些版本兼容的api都是一些宏定义,或者一些接口转化,对最后的体积大小几乎没有任何影响。

然后这部分我这边的config是

no-afalgeng no-async no-autoalginit no-autoerrinit no-capieng
     no-cms no-dgram no-dynamic-engine no-engine no-ec no-ec2m no-filenames no-gost
     no-hw-padlock no-nextprotoneg no-ocsp no-psk no-rfc3779 no-srp no-srtp no-ts

下面一类是

no-<prot>

Don't build support for negotiating the specified SSL/TLS
                   protocol (one of ssl, ssl3, tls, tls1, tls1_1, tls1_2,
                   tls1_3, dtls, dtls1 or dtls1_2). If "no-tls" is selected then
                   all of tls1, tls1_1, tls1_2 and tls1_3 are disabled.
                   Similarly "no-dtls" will disable dtls1 and dtls1_2. The
                   "no-ssl" option is synonymous with "no-ssl3". Note this only
                   affects version negotiation. OpenSSL will still provide the
                   methods for applications to explicitly select the individual
                   protocol versions.

这些是tls和ssl相关的,是我们https协议中需要的,我们肯定不能全部去掉,最好全部留着,并且经过测试,发现去掉一些后,体积并没有多大变化,还是都留着比较放心,兼容性会更好。


  no-<alg>
                   Build without support for the specified algorithm, where
                   <alg> is one of: aria, bf, blake2, camellia, cast, chacha,
                   cmac, des, dh, dsa, ecdh, ecdsa, idea, md4, mdc2, ocb,
                   poly1305, rc2, rc4, rmd160, scrypt, seed, siphash, sm2, sm3,
                   sm4 or whirlpool.  The "ripemd" algorithm is deprecated and
                   if used is synonymous with rmd160.

上来全部去掉,编译后发现有些算法是必须的,所以把它们去掉了

no-des no-dh no-sock

另外有个选项文档里面并没有提到

no-dso

这个选项不加的话,iOS的app可能会不通过审核,因为是一个动态加载动态库的支持,苹果是不允许的。

经过这样的裁剪Android arm64的库
2.9M libcrypto.a
752K libssl.a
还是小了不少的。并且可以正常使用。

相关文章
|
弹性计算 负载均衡 数据库
阿里云服务器带宽上传下载速度、出入网收费免费说明
用户花钱购买的阿里云服务器公网带宽是指公网出方向带宽,阿里云内网带宽和公网入方向带宽都是免费的。用户购买公网出方向带宽后,阿里云会提供免费的公网入方向带宽,公网入方向带宽10M起步
5759 0
阿里云服务器带宽上传下载速度、出入网收费免费说明
|
Linux 芯片
Linux内核学习(六):linux kernel的Kconfig分析
Linux内核学习(六):linux kernel的Kconfig分析
1181 0
|
Ubuntu Linux 编译器
openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
openssl 的编译(linux、Ubuntu) 和 交叉编译(arm、Hi3531A)的问题分析、解决
2564 0
|
人工智能 资源调度 Kubernetes
混部开源 Koordinator 背后的故事|学习笔记(一)
快速学习混部开源 Koordinator 背后的故事
混部开源 Koordinator 背后的故事|学习笔记(一)
|
应用服务中间件 Linux nginx
FFmpeg学习笔记(一):实现rtsp推流rtmp以及ffplay完成拉流操作
这篇博客介绍了如何使用FFmpeg实现RTSP推流到RTMP服务器,并使用ffplay进行拉流操作,包括在Windows和Linux系统下的命令示例,以及如何通过HTML页面显示视频流。
3041 0
|
算法 安全 Linux
Linux 裁剪并交叉编译openssl库
Linux 裁剪并交叉编译openssl库
621 1
|
12月前
|
Linux 数据安全/隐私保护 C语言
新手向导:轻松离线搭建最新版OpenVPN(含一键安装脚本)
OpenVPN 是常用的虚拟私有网络工具,通过 Docker 搭建非常简单。但常用的 kylemanna/openvpn 镜像已三年未更新,停留在 OpenVPN 2.4 版本。为了升级到最新版本(如 2024 年 2 月发布的 v2.6.9),可以通过官方开源社区获取最新安装包并手动编译安装。步骤包括安装依赖、下载并编译 OpenSSL 和 OpenVPN、生成证书和配置文件等。此外,GitHub 上有一键安装脚本 openvpn-install.sh,简化了安装过程,但其版本可能不是最新的。安装完成后,还需配置 iptables 以确保客户端能正常使用代理网络。
14962 1
|
12月前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
资源调度 算法 Linux
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
Linux进程/线程的调度机制介绍:详细解析Linux系统中进程/线程的调度优先级规则
3464 0
|
应用服务中间件 Linux 网络安全