c - 链接到不同版本的 SSL 共享库

标签 c ssl openssl libcrypto

我的应用程序仅使用 OpenSSL 0.9.8 及更高版本支持的功能,但我在安装了 1.0.0 库(使用 -lcrypto)的系统上编译它,并且该应用程序需要 libcrypto.so.1.0.0 或更高版本在安装时。

OpenSSL 显然将整个版本级别“libcrypto.so.1.0.0”编译到库的 SONAME 中,因此除非该特定版本的库存在,否则我的应用程序将无法运行。我知道它不会在只安装 0.9.8 的系统上运行,但如果安装了 1.0.1 怎么办?

对于我使用的所有其他共享库(-lpthreads、-lncurses、..),ldd 将 SONAME 显示为“libxxx.so.N”,因此我只需要安装版本 N。 OpenSSL 是我所知道的唯一依赖于非常特定版本级别 (V.R.M) 的库,因此我担心如果安装的库晚于 libcrypto.so.1.0.0(或库已更新到更新的级别)。

有没有办法编译我的应用程序以使用“libcrypto.so 或”libcrypto.so.1”,而不管它链接到哪个版本?为什么 OpenSSL 在没有其他库时使用 SONAME 中的完整版本我'我知道吗?

最佳答案

不,没有可靠的方法,因为在 OpenSSL 中,内部结构在版本之间不断变化,并且相当多的函数实际上是直接访问/操作结构成员的宏。

不过,如果您确定您的应用程序没有使用任何此类宏,并且愿意承担结构可能发生变化而您的应用程序无法运行的风险,您可以dlopen() libcrypto.so和 dlsym() 您使用的功能。大约有 20 个。请记住,您可能使用的许多函数(例如 SSL_CTX_set_optionsSSL_want_read/SSL_want_write)实际上是导致调用相同函数的宏。

另一种选择是静态链接 libcrypto.alibssl.a。这也会使您的应用程序在根本没有安装 OpenSSL 的系统上运行(尽管这些系统很少)。不过,预计这会使您的应用大小增加 300-900kb。

关于c - 链接到不同版本的 SSL 共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20483501/

相关文章:

c - 如何在网络内核扩展中使用OpenSSL?

C++ - 数组数学

c++ - 将问题与 libMathEval 联系起来

c - 无法使用 C 中 API 库 header 中定义的结构

Apache 基准 HTTPS 失败

java - 为什么在没有配置信任存储位置的情况下从 SoapUI 接受了 SOAP 请求?

wcf - 生产 WCF 上的 "Cannot find the X.509 certificate"但在暂存和本地工作

objective-c - 使用 Transforms/Security.framework 的 RSA 加密 + Objective-C

C++ 如何使用 OpenSSL 验证 Google JWT (RS256)

c - 我在哪里可以找到编写 C 集合的良好指南?