BenBE's humble thoughts Thoughts the world doesn't need yet …

17.05.2009

GnuTLS: Eine Alternative zu mod_ssl

Filed under: Server — Schlagwörter: , , , — BenBE @ 19:06:43

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:

<VirtualHost 127.0.0.1:443>
        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
</VirtualHost>

Von dieser Unterscheidet sich mod_gnutls nur unwesentlich:

<VirtualHost 127.0.0.1:443>
        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
</VirtualHost>

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 regeln:

<VirtualHost 127.0.0.1:443>
        ServerName example.localhost
        DocumentRoot /var/www/ssldocs/
        ErrorLog /var/log/ssl_error_log
 
        <IfModule mod_ssl.c>
                <IfModule !mod_gnutls.c>
                        SSLEngine On
                        SSLProtocol all
                        SSLCipherSuite HIGH:MEDIUM
                        SSLCertificateFile    /etc/ssl/public/example.localhost.crt
                        SSLCertificateKeyFile /etc/ssl/private/example.localhost.key
                </IfModule>
        </IfModule>
 
        <IfModule mod_gnutls.c>
                GnuTLSEnable on
                GnuTLSPriorities SECURE:!MD5
                GnuTLSCertificateFile /etc/ssl/public/example.localhost.crt
                GnuTLSKeyFile /etc/ssl/private/example.localhost.key
        </IfModule>
</VirtualHost>

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:

<IfModule mod_ssl.c>
        <IfModule !mod_gnutls.c>
                Listen 127.0.0.1:443
        </IfModule>
</IfModule>
 
<IfModule mod_gnutls.c>
        Listen 127.0.0.1:443
</IfModule>

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.

Flattr this!

Keine Kommentare »

No comments yet.

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress