OpenSSL 1.1.1的裁剪

  1. 云栖社区>
  2. 博客>
  3. 正文

OpenSSL 1.1.1的裁剪

1130332701764014 2019-09-05 09:27:07 浏览20612

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
还是小了不少的。并且可以正常使用。