Apache2 als ReverseProxy für EAS, OWA und auch OutlookAnywhere

Neben dem NGINX kann natürlich auch der Apache2 für einen ReverseProxy für die Exchange-Dienste EAS (Exchange ActiveSync) und OWA (OutlookWebAccess) verwendet werden – und zusätzlich seit einiger Zeit auch (wieder) für OutlookAnywhere (RPCoverHTTP)! I

Folgende Konfiguration hat bei mir unter Ubuntu 14.04 einwandfrei funktioniert:

1) Apache2 installieren

apt-get install apache2 apache2-doc

2) Modul für OutlookAnywhere installieren

apt-get install libapache2-mod-proxy-msrpc

3) Module aktivieren

a2enmod headers
a2enmod rewrite
a2enmod proxy_http
a2enmod ssl
a2enmod proxy_msrpc

3) Zertifikat erstellen

Jetzt sollte das Zertifikat für die externe Domäne erzeugt werden. Als erstes erzeugen wir die Key-Datei:

openssl genrsa -out server.key 2048

Jetzt erstellen wir eine Zertifikatsanforderung:

openssl req -new -key server.key -out server.csr

Hier ein Beispiel:

Country Name (2 letter code) [AU]: DE
State or Province Name (full name) [Some-State]: Bayern
Locality Name (eg, city) []:Testhausen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Testfirma
Organizational Unit Name (eg, section) []:EDV
Common Name (eg, YOUR name) []:mobile.test.extern
Email Address []:edv@test.extern

Please enter the following ‚extra‘ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Wichtig ist der Common Name -> das ist die externe Domain – hier im Beispiel mobile.test.extern. Challenge Password und optional company name kann leer gelassen werden.

Falls man auch die Autodiscover-Adresse für OutlookAnywhere mit einem Zertifikat absichern will braucht ein SAN-Zertifikat: http://stefan.ploing.de/2014-01-22-san-zertifikat-mit-openssl/

Danach hat man zwei Dateien – die server.key und die server.csr. Jetzt muss nur die Anforderung in die CA eingereicht werden. Ich mache dies immer über die Webschnittstelle der Zertifizierungsstelle. Über http(s)://cert-server/certsrv kann man die csr eingeben und ein Webserver-Zertifikat erstellen. Wichtig hierbei ist das man die csr-Datei nicht in Windows öffnet. Ich empfehle über einen SSH-Client wie Putty auf dem Linux-Server:

cat server.csr

auszuführen und die Ausgabe dann zu kopieren. So stellt man sicher das die Formatierung richtig ist. Ansonsten kann es zu Zertifikatsfehlern kommen. Die Ausgabe sieht dann so aus:

—–BEGIN CERTIFICATE REQUEST—–
MIIBzzCCATgCAQAwgY4xCzAJBgNVBAYTAkRFMQ8wDQYDVQQIDAZCYXllcm4xEzAR
BgNVBAcMClRlc3RoYXVzZW4xDTALBgNVBAoMBFRlc3QxDDAKBgNVBAsMA0VEVjEb
MBkGA1UEAwwSbW9iaWxlLnRlc3QuZXh0ZXJuMR8wHQYJKoZIhvcNAQkBFhB0ZXN0
QHRlc3QuZXh0ZXJuMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDn015lJMsY
N/KvYrV0wNjzZh+82wJY10xliBpg3p63JbUDA3bjL6bv5+Jcas2c0bgZwyNQl6oB
e/1y/fjDAaFXfpBLk/ZQyoJ/c2DFfOloZdoMEJN7veVzU+2m3I6306ADxx8y52MQ
+xD//0zPtasX2ZEdtghS4Arn+fsPQPS+UQIDAQABoAAwDQYJKoZIhvcNAQEFBQAD
gYEAyDDgPv1fTpweDk+N9JKEBgpdlONv2ZHJJ/upxXMW2aUMNXgLNR0IvNC6Q2/K
Bm1oGvtNyqiTDN0VqIfNvnzzSSlYZN85a3G0psHMdybc8TQ2N+RwIqz49+Rw3qrQ
W6c9kruyn17XFCgRC7rxgwIC/T1uWNOxyO28U00pNVJvgjc=
—–END CERTIFICATE REQUEST—–

Das so erstellt Webserver-Zertifikat (als BASE64/DER speichern) kopiert man dann auf den ReverseProxy – z.B. per SCP mit WinSCP. Am Besten ins HomeDirectory des Root-Users – denn dort liegen auch die beiden anderen Dateien (die key- und die csr-Datei).

Danach muss das Zertifikat konvertiert werden:

openssl x509 -inform PEM -in server.cer > server.pem

und kopiert werden:

cp server.pem /etc/ssl/certs/mobile.test.extern.pem
cp server.key /etc/ssl/private/mobile.test.extern.key

4) Apache2 konfigurieren

Wir erstellen jetzt die Exchange-Config-File

vim /etc/apache2/sites-available/exchange.conf

<VirtualHost *:80>

ServerName mobile.test.extern
ServerAlias autodiscover.test.extern
ServerAdmin webmaster@test.extern

ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined

Header always set X-Frame-Options SAMEORIGIN

Header set Server Apache

RequestHeader unset Expect early

Header unset X-AspNet-Version
Header unset X-OWA-Version
Header unset X-Powered-By

ProxyRequests Off

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule ^/owa(.*) https://mobile.test.extern/owa$1 [R,L]
RewriteRule ^/ecp(.*) https://mobile.test.extern/ecp$1 [R,L]
RewriteRule ^/Microsoft-Server-ActiveSync(.*) https://mobile.test.extern/Microsoft-Server-ActiveSync$1 [R,L]

DocumentRoot /var/www

<Directory />
    Order deny,allow
    Deny from all
</Directory>

<Directory /var/www>
    DirectoryIndex index.php index.html
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

<Proxy *>
        Order deny,allow
        Allow from all
</Proxy>

</VirtualHost>

### SSL Host ###
<VirtualHost *:443>

ServerName mobile.test.extern
ServerAlias autodiscover.test.extern
ServerAdmin webmaster@test.extern

ErrorLog /var/log/apache2/error.log
CustomLog /var/log/apache2/access.log combined

Header always set X-Frame-Options SAMEORIGIN

Header set Server Apache

Header unset X-AspNet-Version
Header unset X-OWA-Version
Header unset X-Powered-By

RequestHeader unset Expect early

ProxyRequests Off
ProxyPreserveHost On

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

# owa
ProxyPass /owa https://10.10.10.1/owa
ProxyPassReverse /owa https://10.10.10.1/owa

# ecp
ProxyPass /ecp https://10.10.10.1/ecp
ProxyPassReverse /ecp https://10.10.10.1/ecp

# Microsoft-Server-ActiveSync
ProxyPass /Microsoft-Server-ActiveSync https://10.10.10.1/Microsoft-Server-ActiveSync
ProxyPassReverse /Microsoft-Server-ActiveSync https://10.10.10.1/Microsoft-Server-ActiveSync

# RPC over http(s) / Outlook Anywhere
OutlookAnywherePassthrough On
ProxyPass /rpc https://10.10.10.1/rpc
ProxyPassReverse /rpc https://10.10.10.1/rpc

DocumentRoot /var/www

<Directory />
    Order deny,allow
    Deny from all
</Directory>

<Directory /var/www>
    DirectoryIndex index.php index.html
    Options -Indexes +FollowSymLinks
    Order allow,deny
    Allow from all
</Directory>

<Proxy *>
        SetEnv proxy-nokeepalive 1
        SetEnv force-proxy-request-1.0 1
        Order deny,allow
        Allow from all
</Proxy>

  SSLEngine on
        SSLCertificateFile    /etc/ssl/certs/mobile.test.extern.pem
        SSLCertificateKeyFile /etc/ssl/private/mobile.test.extern.key

  BrowserMatch "MSIE [2-6]" \
    nokeepalive ssl-unclean-shutdown \
    downgrade-1.0 force-response-1.0
  # MSIE 7 and newer should be able to use keepalive
  BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

</VirtualHost>

Die IP 10.10.10.1 ist hier der lokale Exchange-Server.

Wer lieber mit Hostname arbeitet muss man unter Umständen den lokale Exchange Server noch in die hosts-Datei eingetragen werden, damit die Namensauflösung funktioniert.

vi /etc/hosts

und dort die Zeile für die IP-Adresse des lokalen Exchange ergänzen:

10.10.10.1 exch2013.test.local

zum Testen kann man einen Ping auf dem Fully-Qualified Domain Name (FQDN) des Exchange absetzten:

ping exch2013.test.local

Jetzt muss nur noch die Konfigurationsdatei „scharf“ geschaltet werden.

Dazu löschen wir die Default-Konfiguration

rm /etc/apache2/sites-enabled/000-default.conf

und linken unsere Exchange-Konfiguration in den sites-enabled-Ordner

ln -s /etc/apache2/sites-enablede/exchange.confg /etc/apache2/sites-enabled/exchange.conf

Jetzt muss nur noch der Apache2-Dienst neugestartet zu werden:

service apache2 restart

fertig 🙂

5) Testen

Unter https://www.testexchangeconnectivity.com kann man die ActiveSync-Funktion testen.

Quellen: www.sturbi.de, znil.net

2 Kommentare

  1. Hallo

    Spannender Artikel weil da noch 1-2 Optionen dazugekommen sind, die ich so noch nicht kannte.
    Hast du keine Probleme mit gross-kleinschreibung. Ich denke dabei nur an /Microsoft-Server-ActiveSync – hast du keine Clients gesehen, die mal nur die kleingeschriebene Variante verwendet haben?

    1. Hi,

      alle Clients – egal ob auf iOS, Android, Windows, etc – kommen eigentlich sauber mit Microsoft-Server-ActiveSync – so wie es der Standard bzw. Microsoft vorschreibt..
      hab zumindest noch keinen anderen in irdendwelchen Logs gesehen – und ich betreibe viele ActiveSync-Umgebungen (TMG, Nginx, Apache, Sophos) 🙂
      Beschwert hat sich auch noch keiner 😉

Kommentar verfassen