openssl 1.1.0 与 openssl 1.0.2 编译依赖的兼容性问题
———————————————— 版权声明:本文为CSDN博主「墨城之左」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/antony1776/article/details/82801549
1 问题描述
服务器: 龙心/deepin
Linux deepin 3.10.108-deepin+ #3 SMP PREEMPT Tue Jan 23 16:54:44 CST 2018 mips64 GNU/Linux
服务器自带的 openssl 版本:
#> openssl version -a OpenSSL 1.1.0e 16 Feb 2017 built on: reproducible build, date unspecified platform: debian-mips64el
系统中使用的 Ruby 版本为 2.0.0,在安装 puma-2.11.1 时报错:
mini_ssl.c: error:
2 原因
openssl 1.1 与 openssl 1.0.2 相比,有较大的变化,导致应用软件在不改变源码的情况下无法同时支持两个版本。
详细情况,参见:
https://wiki.openssl.org/index.php/OpenSSL_1.1.0_Changes
3 补丁
这种情况下,有三种处理方案:
重新安装低版本的 openssl:影响系统其他应用,不可行
升级 ruby:需要大规模的修改当前应用,不可行
安装兼容性补丁
在编译时出现的问题,主要是因为数据结构和api有较大变化,通过补丁可以解决。
下载补丁: openssl-compat.tar.gz
https://wiki.openssl.org/images/e/ed/Openssl-compat.tar.gz
解压后的 tar 包中包括两个文件:libcrypto-compat.h, libcrypto-compat.c
将解压后的文件放置在待编译的项目中,并在 mini_ssl.c 中添加对 libcrypto-compat.h 的引用。
然后可编译成功。
4 示例
例如,对 puma-2.11.1 打补丁的过程,如下:
1、下载 puma-2.11.1 gem 包源码: github 2、下载补丁: openssl-compat.tar.gz,将解压后的 libcrypto-compat.h, libcrypto-compat.c 文件,拷贝到 puma-2.11.1 源码包的 puma-2.11.1/ext/puma_http11 路径下; 3、打开文件 puma-2.11.1/ext/puma_http11/mini_ssl.c,添加对 libcrypto-compat.h 的引用,如下所示: 4、在 puma-2.11.1/ext/puma_http11 目录下执行:
ruby extconf.rb
make
会编译生成 puma/puma_http11.so