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 настроен показывать все заголовки, поэтому в ответ вы должны увидеть следующее:
apach-openssl

Послесловие

После этого Вы можете без лишней головной боли обновлять как Apache так и OpenSSL по мере выхода новых версий.

Полезными могут быть следующие статьи:

При написании статьи использовались следующие ресурсы: