Content from 2012-06

Virtuelles Hosting für HTTPS mit Apache und mod_gnutls

posted on

Die IPv4-Adressen gehen aus – so ließt man. Im Februar 2011 wurde die letzte freie Adresse in Europa vergeben. Was seitdem getan wird: nichts. Trotzdem leiste ich meinen Beitrag: ich spare IPv4-Adressen mit virtuellem Hosting auch für HTTPS.

HTTPS und die IP-Adressen

Der wichtigste Grund warum ein Webserver mehrere IP-Adressen hat ist HTTPS. Für jede HTTPS-Domain brauchte man bisher eine eigene IP-Adresse. Die Verschlüsselung von HTTPS wird aktiviert bevor der Webbrowser dem Server sagt welche Webadresse er abrufen möchte. Das Problem dabei: das Zertifikat welcher Domain soll der Server nun benutzen? Verwendet er das falsche meckert der Browser. Eine rote Seite erscheint und warnt den Internetnutzer, dass da etwas nicht stimmt und die Seite vielleicht unsicher ist. Das wollen wir nicht!

Die Lösung bisher: jede Domain hat eine eigene IP-Adresse. Muss ein Webserver eine HTTPS-Anfrage beantworten, schaut er welche IP-Adresse angesprochen wurde. Kein Problem, das kann er. Für jede IP-Adresse weiß er die zugehörige Domain. Er kann das richtige Zertifikat nutzen.

Schon 2003 aber wurde Server Name Indication (engl. für „Andeutung des Servernamens“) erfunden [RFC 6066: Transport Layer Security (TLS) Extensions: Extension Definitions]. Moderne Browser übermitteln hiermit schon bevor verschlüsselt wird welche Domain sie erwarten. Wenn sich der Browser an diesen Standard hält, dann kann der Webserver auch ohne verschiedene IP-Adressen erkennen welches Zertifikat er nutzen muss.

Funktioniert das auch immer?

Nein! Sowohl der Browser als auch der Server muss das Verfahren unterstützen. Probleme gibt es wenn der Nutzer mit einem Internet Explorer Version 6 oder mit Windows XP unterwegs sind. Beides ist aber inzwischen selten. Mit anderen Browsern und Betriebssystemen gibt es keine Probleme mehr.

Und der Server? Das haben wir Administratoren selbst in der Hand. Ich nutze Apache mit mod_gnutls. Server Name Indication versteht dieses seit irgendwann zwischen April 2005 (Version 0.2.0) und November 2007 (Version 0.3.4).

Also passt alles?

Leider nein. Ich hatte alles nach Anleitung eingerichtet. Die Fehlermeldungen sind nicht verschwunden. Immer wieder beschwerte sich der Browser: das Zertifikat ist falsch.

Suchen wir mit Google. Es gibt fast kein Problem, das ein anderer schon hatte. Tatsächlich: Jan Krüger beschreibt das gleiche Problem in mod_gnutls and StartSSL level 1 certificates: the problem (and solution).

mod_gnutls berücksichtigt nur die im Feld CN (Common Name) des Zertifikates eingetragene Domain. Dort ist aber nur Platz für eine einzelne Domain. Steht ein Zertifikat für mehrere Domains (z.B. mit ohne ohne „www“), so werden diese in einem anderen Feld eingetragen: Subject Alternative Name / dnsName. Solche Zertifikate hatte ich von StartSSL bekommen.

Jan hat hierfür einen Patch geschrieben und veröffentlicht. Allerdings unterstützt seine Lösung nur bis zu vier Domains pro Zertifikat. In den meisten Fällen reicht das sicherlich. Trotzdem wollte ich das Problem noch allgemeiner lösen.

Meine Version des gnu_tls-Patches kann mit einer beliebigen Anzahl von Domains in einem Zertifikat umgehen.

Ich wollte meine Verbesserung auch anderen Nutzern von Debian und mod_gnutls einfach zur Verfügung stellen. Eine E-Mail habe ich an den Debian-Paket-Betreuer und den Entwickler von mod_gnutls geschickt. Beide kamen unzustellbar zurück.


Unless otherwise credited all material Creative Commons License by Matthias Wimmer