首页 > 解决方案 > find_package(OpenSSL) 无法找到特定的 libssl 版本

问题描述

我正在使用安装了 OpenSSL 版本 1.0.2k 和 0.9.8e 的 RHEL7 系统:

$ ll /usr/lib64/libssl.so*   
lrwxrwxrwx 1 root root     16 Feb 28 19:32 /usr/lib64/libssl.so -> libssl.so.1.0.2k
-rwxr-xr-x 1 root root 340832 Mar  4  2016 /usr/lib64/libssl.so.0.9.8e
-rwxr-xr-x 1 root root 470360 Apr  9  2019 /usr/lib64/libssl.so.1.0.2k
lrwxrwxrwx 1 root root     16 Feb 28 19:31 /usr/lib64/libssl.so.10 -> libssl.so.1.0.2k
lrwxrwxrwx 1 root root     16 Jun 22  2018 /usr/lib64/libssl.so.6 -> libssl.so.0.9.8e

出于兼容性原因,我的程序需要链接到旧的 0.9.8e 版本,但find_package()对于 OpenSSL似乎无法找到它。如果我使用find_package(OpenSSL 0.9.8 REQUIRED COMPONENTS SSL Crypto)它会找到更新的版本:

-- Found OpenSSL: /usr/lib64/libcrypto.so (found suitable version "1.0.2k", minimum required is "0.9.8") found components: SSL Crypto

如果我添加该EXACT选项,CMake 会告诉我找不到该版本:

CMake Error at /path/to/cmake/data/share/cmake-3.17/Modules/FindPackageHandleStandardArgs.cmake:164 (message):
  Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the
  system variable OPENSSL_ROOT_DIR: Found unsuitable version "1.0.2k", but
  required is exact version "0.9.8" (found /usr/lib64/libcrypto.so)

查看输出很明显,FindOpenSSL.cmake只查看指向较新库的符号链接。提供OPENSSL_ROOT_DIR也不是选项,因为两个库都位于同一目录中。是否可以告诉命令查找特定的库/SONAME?

我不想直接链接到正确的库。我应该向 KitWare 报告错误吗?对我来说,这方面的命令似乎被破坏了。

标签: c++ccmakebuildopenssl

解决方案


我建议您升级您的应用程序以与 openssl 1.0.x 或 1.1.x 兼容。

话虽如此,本着回答这个问题的精神,您可以执行以下操作:

mkdir $HOME/openssl0.9.8e && cd $_
wget http://vault.centos.org/5.11/os/x86_64/CentOS/openssl-0.9.8e-27.el5_10.4.x86_64.rpm
wget http://vault.centos.org/5.11/os/x86_64/CentOS/openssl-devel-0.9.8e-27.el5_10.4.x86_64.rpm
for i in *.rpm; do rpm2cpio $i | cpio -idmv; done
cd ..

# If you are using CMake 2.x
cmake -S /path/to/your/project -Bbuild \
   -DOPENSSL_INCLUDE_DIR=$HOME/openssl0.9.8e/usr/include \
   -DOPENSSL_SSL_LIBRARY=$HOME/openssl0.9.8e/usr/lib64/libssl.so \
   -DOPENSSL_CRYPTO_LIBRARY=$HOME/openssl0.9.8e/usr/lib64/libcrypto.so

# If you are using CMake 3.x
cmake3 -S /path/to/your/project -Bbuild -DOPENSSL_ROOT_DIR=$HOME/openssl0.9.8e/usr

OPENSSL_ROOT_DIR由于仅在 3.x 中可用的修复程序,因此无法与 2.x 一起正确使用。

CMakeLists.txt 的示例内容:

cmake_minimum_required(VERSION 3.0.0)

project(so)

find_package(OpenSSL 0.9.8 REQUIRED COMPONENTS SSL Crypto EXACT)

add_executable(main main.x.c)
target_link_libraries(main PRIVATE ${OPENSSL_LIBRARIES})
target_include_directories(main PRIVATE ${OPENSSL_INCLUDE_DIR})

要在构建后运行二进制文件,您可以安装 compat 包:openssl098e在 CentOS7/RHEL7 上或使用:

LD_LIBRARY_PATH=$HOME/openssl0.9.8e/lib64 /path/to/build/main

请注意,您还需要安装krb5-devel,因为它是使用libssl.

您还可以将库与您的应用程序一起提供并包含$ORIGIN在 中RPATH,但我将把它作为一个练习(为了好玩)并且强烈不推荐它,因为您应该更新您的应用程序以使其与 openssl 1.0.x 或 1.1 兼容。 x 并且由于您永远不会获得 0.9.8 库的任何更新,因此这是一个巨大的安全问题。


推荐阅读