Сборка Apache + mod_ssl не связывается с моей сборкой OpenSSL

Вопрос или проблема

Я потратил некоторое время на поиски в интернете, но ничего из найденного не помогает.

Я использую 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 больше не должна появляться. Если проблема сохраняется, возможно, стоит проверить конфигурацию и зависимости других библиотек, чтобы исключить потенциальные конфликты.

Оцените материал
Добавить комментарий

Капча загружается...