Apache + mod_ssl 构建未链接到我的 OpenSSL 构建

Apache + mod_ssl 构建未链接到我的 OpenSSL 构建

我花了一些时间在网上搜索,但我发现的内容似乎都没有帮助。

我正在运行 CentOS 6 64 位,想要使用 mod_ssl 编译 Apache,并且需要将其链接到我自己的 OpenSSL 版本(比操作系统提供的版本更新)。

OpenSSL 1.1.0i 配置为:

./config --prefix=/opt/openssl-1.1.0 --openssldir=/opt/openssl-1.1.0 shared

Apache 2.4 配置为:

./configure --enable-layout=mycustomlayout \
    --prefix=/opt/httpd-2.4.34 \
    --exec-prefix=/opt/httpd-2.4.34 \
    --with-mpm=prefork \
    --enable-so \
    --enable-ssl \
    --with-ssl=/opt/openssl-1.1.0 \
    --enable-cgi \
    --enable-http2 \
    --enable-proxy-http2 \
    --with-included-apr

它似乎编译得很好,但 mod_ssl 不知道 OpenSSL 1.1.0 安装在哪里:

[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => not found
    libcrypto.so.1.1 => not found

所以只有当你明确告诉它去哪里看时才有效:

[root@host .libs]# export LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH
[root@host .libs]# ldd ./mod_ssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007f069149a000)
    libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007f069100a000)

即使将 mod_ssl 静态构建到 httpd 二进制文件中也--enable-mods-static=ssl没有帮助。

我尝试了--enable-ssl--enable-ssl --enable-ssl-staticlib-deps、 和 ,--enable-ssl --enable-ssl-staticlib-deps --enable-mods-static=ssl结果仍然相同:

    libssl.so.1.1 => not found
    libcrypto.so.1.1 => not found

还尝试过,但没有运气,之前设置这些变量./configure

export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
       LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
       LDFLAGS="-L/opt/openssl-1.1.0/lib"

我知道我可以添加到/etc/ld.so.conf.d自动加载新的 OpenSSL 库或调整 Apache 的初始化脚本来添加,LD_LIBRARY_PATH但我更希望让它正常工作,让程序在哪里查找libssl.so/ libcrypto.so,就像我的 PHP 构建一样:

[root@host php]# export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH \
       LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH \
       LDFLAGS="-L/opt/openssl-1.1.0/lib" \
       PHP_PREFIX=/opt/php-7.2.9 \
       EXTENSION_DIR=$PHP_PREFIX/usr/lib64/php/modules
[root@host php]# ./configure […] \
    --with-imap=shared \
    --with-imap-ssl \
    --with-openssl=shared \
    --with-openssl-dir=/opt/openssl-1.1.0/bin

[root@host php]# make
[root@host php]# unset PKG_CONFIG_PATH LD_LIBRARY_PATH LDFLAGS

[root@host modules]# ldd ./openssl.so | grep -iP 'ssl|crypto'
    libssl.so.1.1 => /opt/openssl-1.1.0/lib/libssl.so.1.1 (0x00007fc2220a6000)
    libcrypto.so.1.1 => /opt/openssl-1.1.0/lib/libcrypto.so.1.1 (0x00007fc221c17000)

我究竟做错了什么?这可能是一个错误吗?

答案1

尝试将以下内容添加到 LDFLAGS 环境变量中:

-Bstatic -lssl -lcrypto

.so另外,请确保openssl libdir 上没有任何文件,只有静态.a文件。理想情况下,可以通过将no-shared参数传递给 openssl 配置来完成。

./configure我仍然不确定为什么有时链接器仍然更喜欢共享版本(如果存在),即使我们明确要求静态版本,但可能与httpd 中的脚本处理库依赖关系的方式有关。

虽然配置脚本上的补丁可能会更干净,但仅仅没有.so文件似乎就足以让链接器选择静态版本。

相关内容