无法编译 Apache:“错误,SSL/TLS 库丢失或无法使用”

无法编译 Apache:“错误,SSL/TLS 库丢失或无法使用”
  • Arch Linux 2011.08.19 (Linux 3.4.2 i686)
  • Apache 2.2.22 → 2.2.22(重新编译和重新安装)
  • OpenSSL 1.0.1.c-1

这些细节可能无关紧要,但是:每次有可用升级时,我都会使用 yaourt 和 custompkg 从源代码构建 Apache,这样我就可以将 suexec docroot 更改为我想要的内容,而无需自己手动编辑 PKGBUILD。

在过去,这种方法完美无缺。然而,现在看来,无论出于何种原因,Apache 都无法编译。我刚刚进行了完整的系统升级,因此可能与此有关。

以下是修改后的 PKGBUILD 中的配置行:

../configure --enable-layout=Arch \
    --enable-modules=all \
    --enable-mods-shared=all \
    --enable-so \
    --enable-suexec \
    --with-suexec-caller=http \
    --with-suexec-docroot=/srv/www \
    --with-suexec-logfile=/var/log/httpd/suexec.log \
    --with-suexec-bin=/usr/sbin/suexec \
    --with-suexec-uidmin=99 --with-suexec-gidmin=99 \
    --enable-ldap --enable-authnz-ldap \
    --enable-cache --enable-disk-cache --enable-mem-cache --enable-file-cache \
    --enable-ssl --with-ssl \
    --enable-deflate --enable-cgid \
    --enable-proxy --enable-proxy-connect \
    --enable-proxy-http --enable-proxy-ftp \
    --enable-dbd \
    --with-apr=/usr/bin/apr-1-config \
    --with-apr-util=/usr/bin/apu-1-config \
    --with-pcre=/usr \
    --with-mpm=${mpm}

当我尝试构建时,它似乎运行良好,直到它到达 OpenSSL 的东西:

mkdir modules/ssl
checking whether to enable mod_ssl... checking dependencies
checking for SSL/TLS toolkit base... none
checking for OpenSSL version... checking openssl/opensslv.h usability... yes
checking openssl/opensslv.h presence... yes
checking for openssl/opensslv.h... yes
checking openssl/ssl.h usability... yes
checking openssl/ssl.h presence... yes
checking for openssl/ssl.h... yes
OK
  forcing SSL_LIBS to "-lssl -lcrypto  "
  adding "-lssl" to LIBS
  adding "-lcrypto" to LIBS
checking openssl/engine.h usability... yes
checking openssl/engine.h presence... yes
checking for openssl/engine.h... yes
checking for SSLeay_version... no
checking for SSL_CTX_new... no
checking for ENGINE_init... no
checking for ENGINE_load_builtin_engines... no
checking for SSL_set_cert_store... no
configure: error: ... Error, SSL/TLS libraries were missing or unusable
==> ERROR: A failure occurred in build().
    Aborting...
==> ERROR: Makepkg was unable to build apache.
==> Restart building apache ? [y/N]
==> -------------------------------
==> 

谷歌搜索后,许多人报告解决方案是export LDFLAGS=-ldl,但这对我没有任何影响,无论是在构建脚本中还是在我的 bash 配置文件中设置。

答案1

我在将 openssl 从 0.9.8zb 升级到 1.0.1i 时遇到了同样的问题。

$/tmp/src/openssl-1.0.1i/ ./config --prefix=/usr/local/openssl -fPIC
$/tmp/src/openssl-1.0.1i/ make test
$/tmp/src/openssl-1.0.1i/ sudo make install

$/tmp/src/httpd-2.2.27/ ./config --enable-so --enable-ssl=shared --with-ssl=/usr/local/openssl
...
$configure: error: ... Error, SSL/TLS libraries were missing or unusable

设置环境的解决方案都无法修复我收到的错误消息。

我的解决方案是:

$/tmp/src/openssl-1.0.1i/ ./config --prefix=/usr/local/openssl-1.0.1 -shared -fPIC
$/tmp/src/openssl-1.0.1i/ make clean
$/tmp/src/openssl-1.0.1i/ make
$/tmp/src/openssl-1.0.1i/ make test
$/tmp/src/openssl-1.0.1i/ sudo make install

$sudo /sbin/ldconfig -v /usr/local/openssl-1.0.1/lib

$/tmp/src/httpd-2.2.27/ make clean && make distclean
$/tmp/src/httpd-2.2.27/ ./configure --enable-so --enable-ssl=shared --with-ssl=/usr/local/openssl-1.0.1
$/tmp/src/httpd-2.2.27/ make
$/tmp/src/httpd-2.2.27/ sudo make install

该问题已通过 openssl 配置中的 -shared 值修复。现在我面临另一个问题,即 sslv2 方法无法访问。但这与这个问题无关,我还没有答案。

我将继续搜索有关 sslv2 问题的答案,并在解决后将其发布到相关的 stackexchange 主题。

答案2

其他谷歌搜索可能会引导您设置一些环境变量,如下所示:

$ env LDFLAGS=-ldl

或者

$ export LIBS=-ldl

第一个对我来说失败了,并给了我同样的错误,但第二个有效。

如果第一个不适合您,因为您需要将命令作为单行运行。因为它需要 LDFLAGS 变量运行时并且不会保存。

例如: env LDFLAGS="-ldl" \ ./configure --prefix=/some/path ...

答案3

看起来 httpd 配置包含错误版本的 OpenSSL。

checking for openssl/engine.h... yes
checking for SSLeay_version... no
checking for SSL_CTX_new... no

如果您安装了多个 OpenSSL,则可能会发生这种情况。尝试设置该--with-ssl选项以匹配最新 OpenSSL 安装的前缀。

--enable-ssl \
--with-ssl=/usr/local \

答案4

发生这种情况是因为 openssl 的 pkg-config 文件不再指定对 libdl 的依赖项。查看较新版本的 openssl.pc,您会发现不再包含 -ldl。

这就是设置LIBS=-ldl起作用的原因(以及可能影响共享对象使用的其他方法)。

根据 CHANGES 日志,从 0.9.6h 到 0.9.7 进行了修改,这样 openssl 并不总是需要动态共享对象加载。我不相信 openssl.pc 文件的更改是同时发生的。我没查到这个改动是什么时候发生的。

所以我认为这在技术上是 Apache 使用 pkg-config 来确定构建所需的库的一个错误。我刚刚在尝试构建 Apache 2.2.31 时遇到了同样的问题,所以这个问题已经存在很长一段时间了。

相关内容