Вопрос или проблема
Я потратил некоторое время на поиски в интернете, но ничего из найденного не помогает.
Я использую CentOS 6 64bit и хотел бы скомпилировать Apache с mod_ssl и нужно связать его с моей сборкой 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)
Что я делаю не так? Может быть, это ошибка?
Попробуйте добавить следующее в вашу переменную окружения LDFLAGS:
-Bstatic -lssl -lcrypto
Также убедитесь, что у вас нет файлов .so
в вашей библиотеке openssl, только статические файлы .a
. Это можно сделать, передав параметр no-shared
в конфигурацию openssl.
Я все еще не уверен, почему иногда компоновщик все равно предпочитает общую версию, если она присутствует, даже когда мы явно требуем статические, но, вероятно, это связано с тем, как скрипт ./configure
из httpd обрабатывает зависимости библиотек.
Хотя исправление в скрипте конфигурации было бы, вероятно, более аккуратным, просто отсутствие файлов .so
кажется достаточным для того, чтобы компоновщик выбрал статическую версию вместо этого.
Ответ или решение
Проблема компиляции Apache с модулем mod_ssl и пользовательской сборкой OpenSSL
Вы столкнулись с проблемой при компиляции Apache на CentOS 6, где необходимо связать модуль mod_ssl с вашей собственной сборкой OpenSSL. Давайте тщательно разберем процесс и выясним, что может быть не так.
1. Анализ конфигурации OpenSSL и Apache
Вы правильно указали параметры при конфигурации OpenSSL:
./config --prefix=/opt/openssl-1.1.0 --openssldir=/opt/openssl-1.1.0 shared
Однако, вы хотите использовать именно собственную сборку OpenSSL, что подразумевает, что лучше настроить её на использование статических библиотек. Для этого стоит пересобрать OpenSSL без флага shared
, чтобы не создавать разделяемые библиотеки:
./config --prefix=/opt/openssl-1.1.0 --openssldir=/opt/openssl-1.1.0 no-shared
make
make install
2. Конфигурация Apache
Ваша конфигурация Apache должна ссылаться на правильные пути к OpenSSL. Правильная конфигурация Apache должна выглядеть следующим образом:
./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
Убедитесь, что переменные окружения настроены корректно перед запуском:
export PKG_CONFIG_PATH=/opt/openssl-1.1.0/lib/pkgconfig:$PKG_CONFIG_PATH
export LDFLAGS="-L/opt/openssl-1.1.0/lib -Bstatic -lssl -lcrypto"
export LD_LIBRARY_PATH=/opt/openssl-1.1.0/lib:$LD_LIBRARY_PATH
3. Проверка содержимого библиотек
После установки OpenSSL убедитесь, что в директории /opt/openssl-1.1.0/lib/
нет разделяемых библиотек (.so
). Это можно сделать с помощью команды:
ls -l /opt/openssl-1.1.0/lib/ | grep '\.so'
Если вы обнаружите разделяемые библиотеки, удалите их, чтобы предотвратить возможные конфликты.
4. Компиляция Apache
После изменения конфигурации OpenSSL и установки необходимых переменных окружения, выполните компиляцию Apache:
make clean
./configure ...
make
make install
5. Проверка связывания библиотек
Запустите следующую команду для проверки правильности связывания библиотек в mod_ssl:
ldd /opt/httpd-2.4.34/modules/mod_ssl.so | grep -iP 'ssl|crypto'
6. Динамическая линковка
Если после всех вышеуказанных шагов ошибка всё еще присутствует, убедитесь, что в системных переменных окружения не остались старые значения, указывающие на другие версии OpenSSL. Иногда требуется перезагрузить систему или даже очистить кэш динамической линковки:
ldconfig
Заключение
Если все шаги выполнены корректно, Apache должен успешно связываться с вашей сборкой OpenSSL, и ошибка not found
больше не должна появляться. Если проблема сохраняется, возможно, стоит проверить конфигурацию и зависимости других библиотек, чтобы исключить потенциальные конфликты.