Faire cohabiter Apache et Zimbra OpenSource
Introduction
Sur mon serveur dédié perso j’héberge mon blog ainsi que d’autres sites mais surtout j’héberge ma messagerie personnelle : lovetux.net. C’est un Zimbra OpenSource que j’utilise couplé avec zpush pour avoir une synchronisation agenda, mail et contacts.
Problématique
La problématique est la suivante : je veux accéder au webmail de Zimbra via le protocole HTTPS.
Seulement en faisant écouter Zimbra sur le port 443 je ne peux même pas faire écouter d’autres applications web en HTTPS.
La réponse
La réponse consiste à se servir d’Apache en tant que reverse proxy, le faire écouter sur HTTPS et que Zimbra soit sur autre port.
Les versions
Operating System
root@heretic:~# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.4 LTS
Release: 12.04
Codename: precise
root@heretic:~#
Apache
root@heretic:~# dpkg -l | grep apache
ii apache2 2.2.22-1ubuntu1.4 Apache HTTP Server metapackage
ii apache2-mpm-prefork 2.2.22-1ubuntu1.4 Apache HTTP Server - traditional non-threaded model
ii apache2-utils 2.2.22-1ubuntu1.4 utility programs for webservers
ii apache2.2-bin 2.2.22-1ubuntu1.4 Apache HTTP Server common binary files
ii apache2.2-common 2.2.22-1ubuntu1.4 Apache HTTP Server common files
ii libapache2-mod-php5 5.3.10-1ubuntu3.9 server-side, HTML-embedded scripting language (Apache 2 module)
ii zimbra-apache 8.0.6.GA.5922.UBUNTU12.64 Best email money can buy
root@heretic:~#
Zimbra
zimbra@heretic:~$ zmcontrol -v
Release 8.0.6.GA.5922.UBUNTU12.64 UBUNTU12_64 FOSS edition.
zimbra@heretic:~$
Un peu de configuration côté Zimbra
Toutes les commandes ci-dessous sont à exécuter sous l’utilisateur zimbra.
su - zimbra
zmtlsctl http
zmprov ms $(zmhostname) zimbraMailPort 81
zmcontrol restart
Cela revient à dire à Zimbra de n’écouter qu’en HTTP et sur le port 81. On recharge les fichiers de configurations pour la prise en compte de la modification.
Un peu de configuration côté Apache
Pour Apache voici les points d’attention à prendre en compte :
- générer / utiliser un certificat SSL auto-signé ou commercial si vous avez les moyens
- avoir activé des virtualhosts
- activer le module proxy dans apache
Le point d’entrée que j’utiliserais est le suivant : https://webmail.lovetux.net
SSL
mkdir /etc/apache2/ssl
openssl req -x509 -nodes -days 1000 -newkey rsa:2048 -keyout webmail.lovetux.net.key -out webmail.lovetux.net.crt
Répondre aux différentes questions, le plus important étant de mettre dans Common Name le hostname cité plus haut : webmail.lovetux.net.
Activons le module SSL dans Apache
a2enmod ssl
/etc/init.d/apache2 force-reload
Enfin, il faut dire à Apache d’écouter sur le port 443 :
Listen 46.105.124.192:80
Listen 46.105.124.192:443
Listen 2001:41d0:2:ebc0::1:80
Listen 2001:41d0:2:ebc0::1:443
SSLStrictSNIVHostCheck off
Dans cette section on liste explicitement la ou les adresses IP associées au serveur ainsi que le port d’écoute : 80 et 443.
Le reverse proxy + SSL dans Apache
Bien penser à activer les modules ci-dessous :
a2enmod proxy proxy_http
/etc/init.d/apache2 force-reload
Le virtualhost défini en IPv4 et IPv6 :
root@heretic:/etc/apache2/sites-available# cat webmail.lovetux.net
<VirtualHost 46.105.124.192:443>
ServerName webmail.lovetux.net
DocumentRoot /tmp
CustomLog /var/log/apache2/webmail.lovetux.net-access.log common
ErrorLog /var/log/apache2/webmail.lovetux.net-error.log
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/webmail.lovetux.net.crt
SSLCertificateKeyFile /etc/apache2/ssl/webmail.lovetux.net.key
ProxyPass / http://webmail.lovetux.net:81/
ProxyPassReverse / http://webmail.lovetux.net:81/
</VirtualHost>
<VirtualHost [2001:41d0:2:ebc0::1]:443>
ServerName webmail.lovetux.net
DocumentRoot /tmp
CustomLog /var/log/apache2/zpush.lovetux.net-access.log common
ErrorLog /var/log/apache2/webmail.lovetux.net-error.log
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/webmail.lovetux.net.crt
SSLCertificateKeyFile /etc/apache2/ssl/webmail.lovetux.net.key
ProxyPass / http://webmail.lovetux.net:81/
ProxyPassReverse / http://webmail.lovetux.net:81/
</VirtualHost>
root@heretic:/etc/apache2/sites-available#
Ce qu’il faut adapter :
- les adresses IP
- le serverName
- la valeur du ProxyPass
- la valeur du ProxyPassReverse
Il faut maintenant activer le virtualhost :
a2ensite webmail.lovetux.net
apache2ctl configtest
/etc/init.d/apache2 force-reload
Tester
Prenez votre brouteur préféré puis saisissez le nom de votre serveur en utilisant le protocole HTTPS.
Zpush
Présentation de zpush : ici
On va aussi faire écouter zpush sur HTTPS :
<VirtualHost 46.105.124.192:443>
ServerName zpush.lovetux.net
DocumentRoot /home/www/hindy/zpush.lovetux.net
CustomLog /var/log/apache2/zpush.lovetux.net-ssl-access.log common
ErrorLog /var/log/apache2/zpush.lovetux.net-ssl-error.log
Alias /Microsoft-Server-ActiveSync /home/www/hindy/zpush.lovetux.net/index.php
<Directory /home/www/hindy/zpush.lovetux.net>
AllowOverride All
</Directory>
php_flag magic_quotes_gpc off
php_flag register_globals off
php_flag magic_quotes_runtime off
php_flag short_open_tag on
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/zpush.lovetux.net.crt
SSLCertificateKeyFile /etc/apache2/ssl/zpush.lovetux.net.key
</VirtualHost>
<VirtualHost [2001:41d0:2:ebc0::1]:443>
ServerName zpush.lovetux.net
DocumentRoot /home/www/hindy/zpush.lovetux.net
CustomLog /var/log/apache2/zpush.lovetux.net-ssl-access.log common
ErrorLog /var/log/apache2/zpush.lovetux.net-ssl-error.log
Alias /Microsoft-Server-ActiveSync /home/www/hindy/zpush.lovetux.net/index.php
<Directory /home/www/hindy/zpush.lovetux.net>
AllowOverride All
</Directory>
php_flag magic_quotes_gpc off
php_flag register_globals off
php_flag magic_quotes_runtime off
php_flag short_open_tag on
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/zpush.lovetux.net.crt
SSLCertificateKeyFile /etc/apache2/ssl/zpush.lovetux.net.key
</VirtualHost>
Ne pas oublier de :
- générer un nouveau certif SSL (ici le nom du vhost est zpush.lovetux.net)
- activer le nouveau vhost : a2enmod
- vérifier la configuration du vhost via apache2ctl configtest
- recharger la configuration : /etc/init.d/apache2 force-reload