Howto: Mehrere SSL Zertifikate auf Apache einrichten

Howto: Mehrere SSL Zertifikate auf Apache einrichten


– Gastbeitrag von Stephan Alber –

Derzeit noch eine Fehlermeldung bei Tabs ohne SSL-Zertifikat. In Zukunft wird diese Anwendung gar nicht mehr angezeigt...

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.    

 

Hypertext Transfer Protocol Secure (Screenshot: Wikipedia.org)

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.

Share on FacebookTweet about this on TwitterShare on Google+Pin on PinterestShare on LinkedInBuffer this pageEmail this to someone
Veröffentlichung 18. Juli 2011

Es gibt 3 Kommentare

Deinen hinzufügen
  1. 1
    Atze

    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.

+ Hinterlasse einen Kommentar