Невозможно скомпилировать 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 с customepkg для сборки Apache из исходного кода каждый раз, когда доступно обновление, чтобы я мог изменить docroot suexec на нужный мне, не редактируя вручную 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

Проблема была исправлена ​​значением -shared в конфигурации openssl. Теперь я столкнулся с другой проблемой, которая говорит о том, что метод 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

Это происходит потому, что файл pkg-config для openssl больше не определяет зависимость от libdl. Посмотрите на более новые версии openssl.pc, и вы увидите, что -ldl больше не включен.

Вот почему настройка LIBS=-ldlработает (и, возможно, другие подходы, влияющие на использование общих объектов).

Согласно журналу ИЗМЕНЕНИЙ, при переходе с 0.9.6h на 0.9.7 была сделана модификация, из-за которой openssl не всегда нуждается в динамической загрузке общих объектов. Я не думаю, что изменение в файле openssl.pc произошло в то же время. Я не нашел, когда это изменение было сделано.

Так что я думаю, что технически это ошибка в использовании Apache pkg-config для определения библиотек, необходимых для сборки. Я только что столкнулся с той же проблемой, пытаясь собрать Apache 2.2.31, так что проблема существует уже довольно давно.

Связанный контент