Apache 2.2.31 OpenSSL 1.0.1q на CentOS 6.7
В последнее время все чаще стал сталкиваться с тем, что на серверах нужно каким-то образом обновлять openssl до последней версии.
К сожалению от библиотек OpenSSL зависит очень многое на сервере, поэтому глобально его заменить не получится. Вернее получится, но это приведет к плачевным результатам. Мне как-то удалось собрать rpm пакет OpenSSL 1.0.1n
для CentOS 6.5
, который успешно заменил OpenSSL 1.0.1e, но после этого на сервере перестали работать демоны Apache и MySQL. Они упорно продолжали искать библиотеки от OpenSSL 1.0.1e и не понимали что такое 1.0.1n.
Пару дней назад меня все же добили, и я решил вернуться к поискам решения этой проблемы.
Без сигарет мозг работает лучше, как оказывается. И вот уже некурящий я понял, что не обязательно переписывать системные библиотеки OpenSSL. Можно скомпилировать последний OpenSSL используя пакет с исходным кодом, при этом оставить системный OpenSSL. На основе его уже создать модуль для Apache. К моему счастью (как потом оказалось. изначально я был несчастлив) клиенту нужен был еще и Apache последней версии ветки 2.2, который в репозитариях CentOS 6.7 недоступен.
На подготовительном этапе установим пару пакетов:
yum install gcc make zlib-devel wget
Дальше я буду работать в папке /usr/local/src
. Вы можете выбрать любую другую на свое усмотрение.
Начинаем мы с OpenSSL.
На момент написания этой статьи заменой для 1.0.1e был 1.0.1q. Его и качаем:
wget https://www.openssl.org/source/openssl-1.0.1q.tar.gz
Все собирается очень просто. Главное - не забыть создать shared
библиотеку:
./config -prefix=/opt/openssl -openssldir=/opt/openssl/openssl -shared
make
make install
После этого все компоненты, будут лежать в папке /opt/openssl
.
Некоторые люди любят использовать префикс /usr/local
. В таком случае все файлы после компиляции будут расположены в следующих папках:
- /usr/local/bin
- /usr/local/include
- /usr/local/lib
- /usr/local/openssl
Любой другой пакет OpenSSL можно собрать по аналогии.
Для удобства использования можно слинковать бинарник в папку из переменного окружения $PATH:
ln -s /opt/openssl/bin/openssl /usr/bin/openssl101q
Для коректной работы openssl требует Perl модуль ‘WWW::Curl::Easy’.
yum install perl-WWW-Curl.x86_64
Apache
Версия Apache не критична. У меня в требованиях было использование последней версии ветки 2.2.
Скачиваем и распаковываем:
wget http://ftp.ps.pl/pub/apache/httpd/httpd-2.2.31.tar.gz
tar xf httpd-2.2.31.tar.gz
cd httpd-2.2.31
Минимальный набор опций для скрипта configure будет следующим:
./configure -prefix=/opt/httpd2 -with-included-apr **-enable-ssl=shared -with-ssl=/opt/openssl -enable-ssl-staticlib-deps**
Полный набор модулей будет собран с помощью следующей комбинации опций для configure, при этом каждый модуль будет представлен в виде отдельного файла с расширением so
:
./configure -prefix=/opt/httpd2 -enable-ssl=shared -with-ssl=/opt/openssl -enable-ssl-staticlib-deps=shared -enable-mods-static=ssl=shared -enable-exception-hook=shared -enable-maintainer-mode=shared -enable-pie=shared -enable-authn-dbm=shared -enable-authn-anon=shared -enable-authn-dbd=shared -enable-authn-alias=shared -enable-isapi=shared -enable-file-cache=shared -enable-cache=shared -enable-disk-cache=shared -enable-mem-cache=shared -enable-dbd=shared -enable-reqtimeout=shared -enable-ext-filter=shared -enable-substitute=shared -enable-charset-lite=shared -enable-deflate=shared -enable-log-forensic=shared -enable-logio=shared -enable-mime-magic=shared -enable-cern-meta=shared -enable-expires=shared -enable-headers=shared -enable-ident=shared -enable-usertrack=shared -enable-unique-id=shared -enable-proxy=shared -enable-proxy-connect=shared -enable-proxy-http=shared -enable-proxy-scgi=shared -enable-proxy-ajp=shared -enable-proxy-balancer=shared -enable-optional-hook-export=shared -enable-optional-hook-import=shared -enable-optional-fn-import=shared -enable-optional-fn-export=shared -enable-dav=shared -enable-info=shared -enable-suexec=shared -enable-cgi=shared -enable-cgid=shared -enable-dav-fs=shared -enable-dav-lock=shared -enable-vhost-alias=shared -enable-imagemap=shared -enable-speling=shared -enable-rewrite=shared -enable-so -enable-http
Если Вы получили слудеющую ошибку, значит zlib-devel
отсутствует в системе:
mod_deflate... configure: error: mod_deflate has been requested but can not be built due to prerequisite failures
Осталось дело за малым:
make
make install
По завершении компиляции все файлы будут лежать в папке /opt/httpd2
.
Осталось создать init скрипт и добавить сервис на автозагрузку.
wget -O /etc/init.d/httpd2 /wp-content/uploads/2015/12/httpd2
chmod +x /etc/init.d/httpd2
chkconfig httpd2 on
Во время сборки нужные библиотеки не были скопированы в папку Apache, поэтому демон откажется запускаться. Выполните следующее:
ln -s /opt/openssl/lib/libcrypto.so.1.0.0 /opt/httpd2/lib/
ln -s /opt/openssl/lib/libssl.so.1.0.0 /opt/httpd2/lib/
Теперь можно запускать:
/etc/init.d/httpd2 start
Линкуем apachectl:
ln -s /opt/httpd2/bin/apachectl /usr/sbin/apachectl2
Для проверки можно воспользоваться утилитой telnet. Будучи в косоли сервера выполните:
telnet localhost 80
После того как увидие приветствие от сервера apache, выполните:
HEAD / HTTP/1.0
По умолчанию Apache настроен показывать все заголовки, поэтому в ответ вы должны увидеть следующее:
Послесловие
После этого Вы можете без лишней головной боли обновлять как Apache
так и OpenSSL
по мере выхода новых версий.
Полезными могут быть следующие статьи:
- Затыкаем слабые места в настройках SSL Apache
- Установка PHP из исходников
- Установка mod_security для Apache
- Установка mod_geoip
- Создаем безопасный WEB сервер
При написании статьи использовались следующие ресурсы: