無法編譯 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

其他Google搜尋可能會引導您設定一些環境變量,如下所示:

$ 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 時遇到了同樣的問題,所以這個問題已經存在很長一段時間了。

相關內容