Ich habe ja die Tage über diverse kaputte Pakete bei Debian rumgemeckert und dabei auch mod_gnutls mit erwähnt, woraufhin es eine interessierte Zuschrift gab, in der mitgeteilt wurde, sich dieses Modul auch einmal angucken zu wollen. Um den Einstieg bei mod_gnutls nicht allzu schwer zu gestalten bin ich einmal nicht so und gebe hiermit einmal einen Schnelleinstieg, mit einer Reihe Informationen zur Konfiguration.
Wie bereits früher in meinem Blog erwähnt, bietet Debian mit libapache2-mod-gnutls ein fertiges Paket für dieses Modul an, welches jedoch in der Version 0.5.2-1 (und 0.5.1-1 nicht mit Apache 2.2.11-3 zusammen läuft (Apache 2.2.11-2 geht, aber es geht auch ohne Downgrade). Abhilfe schafft es hier, den in einer Antwort beschriebenen Workaround durchzuführen, der neben der Beseitigung des Fehlers auch den Vorteil hat, dass man nebenbei gleich ein Update von mod_gnutls auf Version 0.5.4 inklusive bekommt.
Ist das Paket nun nach Anleitung installiert empfiehlt es sich, auf das Debian-eigene Paket ein Version Forbid zu setzen, damit man seine Arbeit nicht aus Versehen bei einem Update zerstört.
Nun geht es an die Konfiguration der Domain. Dass die benötigten SSL-Zertifikate vorhanden sind, sollte Voraussetzung für diesen Schritt sein, ansonsten empfiehlt es sich, diese jetzt noch schnell zu erzeugen. Sowohl der Private Schlüssel als auch die Zertifikat-Datei sollten im PEM-Format vorliegen, andere Formate sind auch möglich. Möchte man zudem nicht für jeden Apache-Neutstart ddas Passwort für die einzelnen Zertifikate eingeben, sollten die Privaten Schlüssel ohne Passwort im System hinterlegt sein.
Bis hierhin läuft die Arbeit mit mod_gnutls analog zu mod_ssl. Beide Module laufen parallel und können gleichzeitig in den Apache geladen werden, dürfen dann aber nicht auf der gleichen IP vHosts bedienen. Zudem muss man darauf achten, dass mod_ssl streng IP-based vHosts haben möchte, während mod_gnutls diese lediglich bevorzugt, deren Verwendung aber empfiehlt. Da man bei Beachtung dieser Vorzüge seine Konfiguration flexibel für beide Module gestalten kann, werde ich im Folgenden mit IP-based vHosts arbeiten; die Anpassung für namebased vHosts sollte jedem Admin ohne große Mühe mit Hilfe der Apache-Doku selbst gelingen.
Wer bereits Erfahrung mit mod_ssl hat, der wird eine Grundstruktur für einen SSL-vHost vermutlich wie folgt konfigurieren:
ServerName example.localhost
DocumentRoot /var/www/ssldocs/
ErrorLog /var/log/ssl_error_log
SSLEngine On
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLCertificateFile /etc/ssl/public/example.localhost.crt
SSLCertificateKeyFile /etc/ssl/private/example.localhost.key
Von dieser Unterscheidet sich mod_gnutls nur unwesentlich:
ServerName example.localhost
DocumentRoot /var/www/ssldocs/
ErrorLog /var/log/ssl_error_log
GnuTLSEnable on
GnuTLSPriorities SECURE:!MD5
GnuTLSCertificateFile /etc/ssl/public/example.localhost.crt
GnuTLSKeyFile /etc/ssl/private/example.localhost.key
Wie leicht erkennbar ist, folgt mod_gnutls dem gleichen Schema wie mod_ssl auch, einzig die Befehle haben einen leicht anderen Namen und einen anderen Präfix. Welche Befehle genau zur Verfügung stehen, findet sich in der recht ausführlichen Dokumentation in der auch eine Reihe typischer Szenarien abgehandelt werden.
Möchte man seine Konfiguration so gestalten, dass sie unabhängig davon läuft, ob mod_ssl oder mod_gnutls (oder beide) geladen sind, so kann man dies über
ServerName example.localhost
DocumentRoot /var/www/ssldocs/
ErrorLog /var/log/ssl_error_log
SSLEngine On
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLCertificateFile /etc/ssl/public/example.localhost.crt
SSLCertificateKeyFile /etc/ssl/private/example.localhost.key
GnuTLSEnable on
GnuTLSPriorities SECURE:!MD5
GnuTLSCertificateFile /etc/ssl/public/example.localhost.crt
GnuTLSKeyFile /etc/ssl/private/example.localhost.key
Fehlt eigentlich nur noch, dass wir dem Apache mitteilen, dass wir auf Port 443 SSL-Verbindungen entgegen nehmen wollen.
Listen 127.0.0.1:443
oder andere Alternativen hierzu erledigen diese Aufgabe für uns. Soll auch hier die Kompatibilität und Flexibilität gewährleistet sein, so sollte dieser Block wie folgt lauten:
Listen 127.0.0.1:443
Listen 127.0.0.1:443
Hiernach nur noch dafür sorgen, dass der Apache das Modul läd, was aber mit Hilfe einer Shell mit zwei kurzen Befehlen erledigt ist:
a2enmod gnutls
apache2ctl restart
Gab es bisher keine Probleme, sollte der Apache nun korrekt hochstarten und reibungslos seinen Dienst verrichten. Ein kurzer Blick auf https://example.localhost/ sollte diesen Eindruck bestätigen. Lief alles korrekt UND nutzt der Browser TLS v1.0+ mit SNI, sollte auch bei mehreren Zertifikaten immer das richtige vorgezeigt werden. Sollte es Probleme geben, hilft u.U. ein Blick in die Liste der vom Apache erkannten vHosts. Diese kann mit einem Aufruf von apache2ctl ermittelt werden:
apache2ctl -t -D DUMP_VHOSTS
Sollte diese, wie in meinem Fall länger sein, hilft Folgendes:
apache2ctl -t -D DUMP_VHOSTS 2>&1 | less
Ich hoffe, das hilft bei der Konfiguration des Servers als Einstieg.