– Gastbeitrag von Stephan Alber –
Bekanntermaßen müssen ab 1. Oktober 2011 alle Facebook Apps über ein SSL Zertifikat verfügen – ansonsten sollen diese laut Facebook Developer Roadmap nicht mehr erreichbar sein (auch für „nicht SSL Surfer“). Mit einem der großen Standard-Hoster (wie bspweise 1&1) wird die Einrichtung der Zertifikate wenig Probleme bereiten. Anders sieht es aus, wenn man einen Root-Server betreibt und dort eine Vielzahl von Apps hostet. Die Installation des ersten Zertifikats funktioniert in den meisten Fällen mehr oder weniger reibungslos, beim zweiten tauchen dann Probleme beim konfigurieren auf. Doch machen wir es kurz: Mit dem standardmäßig installierten „mod_ssl“ kann ein Apache Server nur ein (!) SSL Zertifikat behandeln.
Hier liegt der Hund begraben: Apache vhosts + mod_ssl
Grund hierfür ist die Mechanik der Apache Vhots. Die Zuordnung der Anfragen auf die jeweiligen Projekte erfolgt über den „Hostname“ (Bsp: kundenname.meinedomain.de). Die Anfrage kann jedoch erst gelesen werden, nachdem die SSL Verbindung aufgebaut wurde. Daher wird in der Regel vom Apache die erste gefundene SSL Konfiguration ausgewählt und an den Client gesendet. Im späteren Ablauf kann der Apache zwar das richtige SSL Zertifikat auswählen, zu diesem Zeitpunkt wurde der sogenannte „Handshake“ jedoch bereits ausgeführt, wodurch vom Browser Fehlermeldungen auf Grund falscher Hostnamen Zertifikatsfehler angezeigt werden. Weitere Informationen zum Ablauf findet auf Wikipedia unter den Begriffen OSI-Schichtenmodell und SSL Handshake Protoccol.
Lösungen
- Je SSL Zertifikat eine eigene IP-Adresse oder einen anderen Port verwenden. Aufwendig und teuer, daher wenig praktikabel.
- SNI: Server Name Indication ist eine Erweiterung zur Verschlüsselung der Datenübertragung mit TLS. Bei dieser Erweiterung des SSL-Protokolls wird bereits beim Verbindungsaufbau vor dem SSL-Handshake der gewünschte Hostname mitgesendet. Da der Apache hierfür üblicherweise neu kompiliert werden muss – und dies im laufenden Betrieb ein eher unbeliebter Vorgang ist – ebenfalls keine gute Lösung.
- mod_gnutls: Zum Schluss noch eine schnelle und einfache Lösung. Mit der Apache Erweiterung „mod_gnutls“ ist die Einrichtung von „namebased“ Zertifikate problemlos möglich.
Mod_gnutls Installation
Das Modul kann über apt-get geladen und installiert werden:
apt-get install libapache2-mod-gnutls
Anschließend das Modul über die Apache Config oder Shell aktivieren:
a2enmod gnutls
Die Config gnutls.conf (/etc/apache2/mods-available) sollte wie folgt aussehen:
<IfModule mod_gnutls.c>
GnuTLSCache dbm /var/cache/apache2/gnutls_cache
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
GnuTLSCacheTimeout 300
</IfModule>
Die Apache Ports Config wie folgt anpassen (/etc/apache2/ports.conf):
NameVirtualHost *:443
NameVirtualHost *:80
Listen 443
Listen 80
Eine Domain + Zertifikat wird nun wie folgt eingerichtet:
<VirtualHost *:80>
ServerName www.domain.de
DocumentRoot „/var/www/projekt_titel/web/“
<Directory „/var/www/projekt_titel/web/“>
…
</Directory>
</VirtualHost>
<VirtualHost *:443>
ServerName www.domain.de
DocumentRoot „/var/www/projekt_titel/web/“
GnuTLSEnable on
GnuTLSCertificateFile /CA/www.domain.de/www.domain.de.crt
GnuTLSKeyFile /CA/www.domain.de/www.domain.de.dec.key
GnuTLSPriorities SECURE:!MD5
</VirtualHost>
Nächstes Problem: „SSLCertificateChainFile“
Bei einigen Zertifizierungsstellen muss neben dem Zertifikat noch ein sogenanntes „Intermediate Certificate“ installiert werden. Bei mod_ssl gibt es hierfür die Konfigurationseinstellung „SSLCertificateChainFile“. Bei mod_gnutls gibt es keine entsprechende Konfigurationsmöglichkeit. Doch die Lösung ist äußerst trivial: einfach den Inhalt der SSLCertificateChainFile in die Datei „GnuTLSCertificateFile“ hineinkopieren. Per Shell kann dies wie folgt vorgenommen werden:
cat www.domain.de.crt sub.class1.server.ca.pem > www.domain.de.gnutls.crt
Die neue Datei als „GnuTLSCertificateFile“ einstellen, neustarten und fertig.
Zum Schluss: Die Kosten
Ein Zertifikat muss nicht immer für teures Geld erworben werden. Einige wenige Anbieter stellen kostenfrei Zertifikate aus. Wir haben den Anbieter StartSSL (www.startssl.com) getestet. Die Zertifikate werden von allen gängigen Browsern unterstützt. Ein normales Class 1 Webserver-Zertifikat gibt es kostenfrei, höherwertige Zertifikate können zu angemessenen Preisen erworben werden.
Nachtrag:
Wer auf seinem Server die Möglichkeit hat mehrere IP Adressen einzurichten braucht den hier beschriebenen Mod nicht. Hier werden die verschiedenen IP Adressen dann den verschiedenen Virtual-Hosts zugeordnet.
Über den Author:
Stephan Alber studierte Online Medien (B.Sc.) an der Hochschule Furtwangen. Unter dem Label “FranciMedia“ entwickelt er für namhafte Kunden objekt-orientierte PHP Anwendungen sowie barrierefreie HTML/CSS Layouts. Von FranciMedia erstellte Anwendungen und Spiele wurden im laufenden Jahr von rund 1.000.000 Facebook Nutzern verwendet.
Das ist doch eh nur für app-Entwickler interessant oder? Ich nutze zB das „Simple Facebook Connect“ WP-Plugin auf meinen WordPress-Seiten, aber da liegt die App ja nicht auf meinem Server.
Nur das SNI erst ab Vista auch für den IE verfügbar ist.
Also leider noch nicht brauchbar …
http://de.wikipedia.org/wiki/Server_Name_Indication#Unterst.C3.BCtzte_Software
Sehr gute Anleitung, genau das hab ich für meine Server gesucht.
habe dort drei vHosts laufen und alle mit verschiedenen Zertifikaten.