Apache 2.4.7 kompilieren und lokal installieren

Der bei Ubuntu 12.04.3 LTS eingesetzte Apache ist derzeit noch die Version 2.2.22, und dieser unterstützt leider keine „Forward Secrecy„. Um zumindest testweise zu ermitteln, wie gut oder wie schlecht sich eine kompatible Version (z.B. 2.4.7) kompilieren und nutzen lässt, habe ich mich durch die Konfiguration auf einem Ubuntu 12.04.3 LTS Server gearbeitet und heraus kam dieses Skript „compile_apache.sh“.

Damit der Test-Apache keine Konflikte mit meiner regulären Installation bekommt, ändert dieses Skript auch direkt die Ports (80 -> 65080 und 443 -> 65443) und aktiviert die von SSL Labs empfohlenen SSL-Einstellungen. Damit der Apache mit SSL funktioniert, müssen noch die SSL-Keys hinterlegt werden:

${TARGETINSTALLDIR}/conf/server.crt
${TARGETINSTALLDIR}/conf/server.key

Am Ende des Skripts werden noch zwei Shell-Skripte im Zielverzeichnis erstellt, und die SSL-Keys vom regulären Server kopiert. Möchte man diesen Apache in einer produktiven Umgebung nutzen, müssen natürlich das TARGETINSTALLDIR und die Start/Stop-Skripte angepasst werden.

Das Skript hat den Stand 24. November 2013, die Versionen von Apache, APR, APRUtil, PCRE und OpenSSL sind miteinander kompatibel und können mit den gegebenen Konfigurationseinstellungen erfolgreich kompiliert werden. Eine Aktualisierung auf neuere Versionen ist möglich, aber muss manuell im Skript angepasst werden.

Wenn alles funktioniert hat, ist unter dem aktuellen Hostnamen der Apache auf dem Port 65443 via HTTPS erreichbar. Ein sslscan liefert dann folgendes Ergebnis:

user@host: sslscan hostname | grep Accepted
    Accepted  TLSv1  256 bits  ECDHE-RSA-AES256-SHA
    Accepted  TLSv1  256 bits  DHE-RSA-AES256-SHA
    Accepted  TLSv1  256 bits  DHE-RSA-CAMELLIA256-SHA
    Accepted  TLSv1  128 bits  ECDHE-RSA-AES128-SHA
    Accepted  TLSv1  128 bits  DHE-RSA-AES128-SHA
    Accepted  TLSv1  128 bits  DHE-RSA-SEED-SHA
    Accepted  TLSv1  128 bits  DHE-RSA-CAMELLIA128-SHA

Und hier das eigentliche Skript „compile_apache.sh“:

#!/bin/bash
 
# Einfaches Skript, welches die Sourcen besorgt, korrekt auspackt, configure korrekt startet
# und damit den Apache 2.4 kompiliert. Das Zielverzeichnis ist:
TARGETINSTALLDIR=~/localapache/
APACHEVERSION="2.4.7"
APRVERSION="1.5.0"
APRUTILVERSION="1.5.3"
PCREVERSION="8.33"
OPENSSLVERSION="1.0.1e"
USEMIRROR="http://ftp-stud.hs-esslingen.de/pub/Mirrors/ftp.apache.org/dist/"
HTTPAPACHE="/httpd/httpd-${APACHEVERSION}.tar.bz2"
HTTPAPR="/apr/apr-${APRVERSION}.tar.bz2"
HTTPAPRUTIL="/apr/apr-util-${APRUTILVERSION}.tar.bz2"
FTPPCRE="ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-${PCREVERSION}.tar.gz"
HTTPOPENSSL="http://www.openssl.org/source/openssl-${OPENSSLVERSION}.tar.gz"
THISDIR="${PWD}"
THISHOST=`hostname`
 
# Clean up
# rm -Rf httpd-${APACHEVERSION}
# rm -Rf pcre-${PCREVERSION}
rm -Rf ${TARGETINSTALLDIR}
 
# Download
wget -nc ${USEMIRROR}${HTTPAPACHE}
wget -nc ${USEMIRROR}${HTTPAPR}
wget -nc ${USEMIRROR}${HTTPAPRUTIL}
wget -nc ${FTPPCRE}
wget -nc ${HTTPOPENSSL}
 
# Compile PCRE
cd ${THISDIR}
if [ ! -d pcre-${PCREVERSION} ]; then
  tar xfz pcre-${PCREVERSION}.tar.gz
fi
if [ ! -f ${TARGETINSTALLDIR}/lib/libpcre.so ]; then
  cd pcre-${PCREVERSION}
  ./configure --prefix=${TARGETINSTALLDIR}
        if [[ $? -ne 0 ]] ; then exit 1; fi
  make
        if [[ $? -ne 0 ]] ; then exit 1; fi
  make install
        if [[ $? -ne 0 ]] ; then exit 1; fi
fi
 
# Compile OpenSSL
cd ${THISDIR}
if [ ! -d openssl-${OPENSSLVERSION} ]; then
        tar xfz openssl-${OPENSSLVERSION}.tar.gz
fi
if [ ! -f ${TARGETINSTALLDIR}/lib/libssl.so ]; then
        cd openssl-${OPENSSLVERSION}
        if [ ! -e config.status ]; then
                ./config shared --prefix=${TARGETINSTALLDIR}
                if [[ $? -ne 0 ]] ; then exit 1; fi
        fi
        make
        if [[ $? -ne 0 ]] ; then exit 1; fi
        make install
        if [[ $? -ne 0 ]] ; then exit 1; fi
fi
 
# Prepare APR for APACHE
cd ${THISDIR}
if [ ! -d httpd-${APACHEVERSION} ]; then
  tar xfj httpd-${APACHEVERSION}.tar.bz2
fi
cd httpd-${APACHEVERSION}/srclib
 
if [ ! -d apr ]; then
  tar xfj ../../apr-${APRVERSION}.tar.bz2
  mv apr-${APRVERSION} apr
fi
 
if [ ! -d apr-util ]; then
  tar xfj ../../apr-util-${APRUTILVERSION}.tar.bz2
  mv apr-util-${APRUTILVERSION} apr-util
fi
 
# Compile APACHE
cd ${THISDIR}/httpd-${APACHEVERSION}
if [ ! -e config.status ]; then
  ./configure --with-included-apr --prefix=${TARGETINSTALLDIR} --with-pcre=${TARGETINSTALLDIR} --enable-file-cache --enable-cache --enable-disk-cache --enable-mem-cache --enable-deflate --enable-expires --enable-headers --enable-usertrack --enable-ssl --enable-cgi --enable-vhost-alias --enable-rewrite --enable-so --with-ssl=${TARGETINSTALLDIR}
  if [[ $? -ne 0 ]] ; then exit 1; fi
fi
echo "apache: make..."
make >log_apache_make
if [[ $? -ne 0 ]] ; then exit 1; fi
echo "apache: make install..."
make install >log_apache_make_install
if [[ $? -ne 0 ]] ; then exit 1; fi
 
# Change port and add ssl in config
mv ${TARGETINSTALLDIR}/conf/httpd.conf ${TARGETINSTALLDIR}/conf/httpd.conf-old
if [[ $? -ne 0 ]] ; then exit 1; fi
sed "
s/Listen 80/Listen 65080/
s/#LoadModule ssl_module modules\/mod_ssl.so/LoadModule ssl_module modules\/mod_ssl.so/
s/#Include conf\/extra\/httpd-ssl\.conf/Include conf\/extra\/httpd-ssl\.conf/
s/#LoadModule socache_shmcb_module modules\/mod_socache_shmcb.so/LoadModule socache_shmcb_module modules\/mod_socache_shmcb.so/
" ${TARGETINSTALLDIR}/conf/httpd.conf-old >${TARGETINSTALLDIR}/conf/httpd.conf
if [[ $? -ne 0 ]] ; then exit 1; fi
 
mv ${TARGETINSTALLDIR}/conf/extra/httpd-ssl.conf ${TARGETINSTALLDIR}/conf/extra/httpd-ssl.conf-old
if [[ $? -ne 0 ]] ; then exit 1; fi
sed "
s/Listen 443/Listen 65443/
s/<VirtualHost _default_:443>/<VirtualHost _default_:65443>/
s/ServerName www.example.com:443/ServerName ${THISHOST}:65443/
s/SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5/SSLProtocol all -SSLv2 -SSLv3\nSSLHonorCipherOrder on\nSSLCipherSuite \"EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4\"/
" ${TARGETINSTALLDIR}/conf/extra/httpd-ssl.conf-old >${TARGETINSTALLDIR}/conf/extra/httpd-ssl.conf
if [[ $? -ne 0 ]] ; then exit 1; fi
 
# Create start script
echo "#!/bin/bash
${TARGETINSTALLDIR}/bin/apachectl -f ${TARGETINSTALLDIR}/conf/httpd.conf -k start" >${TARGETINSTALLDIR}/run.sh
echo "#!/bin/bash
${TARGETINSTALLDIR}/bin/apachectl -f ${TARGETINSTALLDIR}/conf/httpd.conf -k stop" >${TARGETINSTALLDIR}/stop.sh
chmod u+x ${TARGETINSTALLDIR}/run.sh ${TARGETINSTALLDIR}/stop.sh

Schreibe einen Kommentar