{"id":273,"date":"2009-05-17T19:06:43","date_gmt":"2009-05-17T19:06:43","guid":{"rendered":"http:\/\/blog.benny-baumann.de\/?p=273"},"modified":"2009-05-17T19:06:43","modified_gmt":"2009-05-17T19:06:43","slug":"gnutls-eine-alternative-zu-mod_ssl","status":"publish","type":"post","link":"https:\/\/blog.benny-baumann.de\/?p=273","title":{"rendered":"GnuTLS: Eine Alternative zu mod_ssl"},"content":{"rendered":"<p>Ich habe ja die Tage \u00fcber <a href=\"http:\/\/blog.benny-baumann.de\/?p=260\">diverse kaputte Pakete bei Debian<\/a> rumgemeckert und dabei auch <a href=\"http:\/\/www.outoforder.cc\/projects\/apache\/mod_gnutls\/\">mod_gnutls<\/a> mit erw\u00e4hnt, 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.<!--more--><\/p>\n<p>Wie bereits fr\u00fcher in meinem Blog erw\u00e4hnt, bietet Debian mit <a href=\"http:\/\/packages.debian.org\/de\/squeeze\/libapache2-mod-gnutls\">libapache2-mod-gnutls<\/a> ein fertiges Paket f\u00fcr dieses Modul an, welches jedoch in der Version 0.5.2-1 (und 0.5.1-1 <a href=\"http:\/\/bugs.debian.org\/cgi-bin\/bugreport.cgi?bug=523060\">nicht mit Apache 2.2.11-3 zusammen<\/a> l\u00e4uft (Apache 2.2.11-2 geht, aber es geht auch ohne Downgrade). Abhilfe schafft es hier, den <a href=\"http:\/\/bugs.debian.org\/cgi-bin\/bugreport.cgi?bug=523060#20\">in einer Antwort beschriebenen Workaround<\/a> durchzuf\u00fchren, 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.<\/p>\n<p>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\u00f6rt.<\/p>\n<p>Nun geht es an die Konfiguration der Domain. Dass die ben\u00f6tigten SSL-Zertifikate vorhanden sind, sollte Voraussetzung f\u00fcr diesen Schritt sein, ansonsten empfiehlt es sich, diese jetzt noch schnell zu erzeugen. Sowohl der Private Schl\u00fcssel als auch die Zertifikat-Datei sollten im PEM-Format vorliegen, andere Formate sind auch m\u00f6glich. M\u00f6chte man zudem nicht f\u00fcr jeden Apache-Neutstart ddas Passwort f\u00fcr die einzelnen Zertifikate eingeben, sollten die Privaten Schl\u00fcssel ohne Passwort im System hinterlegt sein.<\/p>\n<p>Bis hierhin l\u00e4uft die Arbeit mit mod_gnutls analog zu mod_ssl. Beide Module laufen parallel und k\u00f6nnen gleichzeitig in den Apache geladen werden, d\u00fcrfen dann aber nicht auf der gleichen IP vHosts bedienen. Zudem muss man darauf achten, dass mod_ssl streng IP-based vHosts haben m\u00f6chte, w\u00e4hrend mod_gnutls diese lediglich bevorzugt, deren Verwendung aber empfiehlt. Da man bei Beachtung dieser Vorz\u00fcge seine Konfiguration flexibel f\u00fcr beide Module gestalten kann, werde ich im Folgenden mit IP-based vHosts arbeiten; die Anpassung f\u00fcr namebased vHosts sollte jedem Admin ohne gro\u00dfe M\u00fche mit Hilfe der Apache-Doku selbst gelingen.<\/p>\n<p>Wer bereits Erfahrung mit mod_ssl hat, der wird eine Grundstruktur f\u00fcr einen SSL-vHost vermutlich wie folgt konfigurieren:<\/p>\n<pre lang=\"apache\">\r\n<VirtualHost 127.0.0.1:443>\r\n        ServerName example.localhost\r\n        DocumentRoot \/var\/www\/ssldocs\/\r\n        ErrorLog \/var\/log\/ssl_error_log\r\n\r\n        SSLEngine On\r\n        SSLProtocol all\r\n        SSLCipherSuite HIGH:MEDIUM\r\n        SSLCertificateFile    \/etc\/ssl\/public\/example.localhost.crt\r\n        SSLCertificateKeyFile \/etc\/ssl\/private\/example.localhost.key\r\n<\/VirtualHost>\r\n<\/pre>\n<p>Von dieser Unterscheidet sich mod_gnutls nur unwesentlich:<\/p>\n<pre lang=\"apache\">\r\n<VirtualHost 127.0.0.1:443>\r\n        ServerName example.localhost\r\n        DocumentRoot \/var\/www\/ssldocs\/\r\n        ErrorLog \/var\/log\/ssl_error_log\r\n\r\n        GnuTLSEnable on\r\n        GnuTLSPriorities SECURE:!MD5\r\n        GnuTLSCertificateFile \/etc\/ssl\/public\/example.localhost.crt\r\n        GnuTLSKeyFile \/etc\/ssl\/private\/example.localhost.key\r\n<\/VirtualHost>\r\n<\/pre>\n<p>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\u00e4fix. Welche Befehle genau zur Verf\u00fcgung stehen, findet sich in der recht <a href=\"http:\/\/www.outoforder.cc\/projects\/apache\/mod_gnutls\/docs\/\">ausf\u00fchrlichen Dokumentation<\/a> in der auch eine Reihe typischer Szenarien abgehandelt werden.<\/p>\n<p>M\u00f6chte man seine Konfiguration so gestalten, dass sie unabh\u00e4ngig davon l\u00e4uft, ob mod_ssl oder mod_gnutls (oder beide) geladen sind, so kann man dies \u00fcber <ifmodule> regeln:<\/p>\n<pre lang=\"apache\">\r\n<VirtualHost 127.0.0.1:443>\r\n        ServerName example.localhost\r\n        DocumentRoot \/var\/www\/ssldocs\/\r\n        ErrorLog \/var\/log\/ssl_error_log\r\n\r\n        <IfModule mod_ssl.c>\r\n                <IfModule !mod_gnutls.c>\r\n                        SSLEngine On\r\n                        SSLProtocol all\r\n                        SSLCipherSuite HIGH:MEDIUM\r\n                        SSLCertificateFile    \/etc\/ssl\/public\/example.localhost.crt\r\n                        SSLCertificateKeyFile \/etc\/ssl\/private\/example.localhost.key\r\n                <\/IfModule>\r\n        <\/IfModule>\r\n\r\n        <IfModule mod_gnutls.c>\r\n                GnuTLSEnable on\r\n                GnuTLSPriorities SECURE:!MD5\r\n                GnuTLSCertificateFile \/etc\/ssl\/public\/example.localhost.crt\r\n                GnuTLSKeyFile \/etc\/ssl\/private\/example.localhost.key\r\n        <\/IfModule>\r\n<\/VirtualHost>\r\n<\/pre>\n<p>Fehlt eigentlich nur noch, dass wir dem Apache mitteilen, dass wir auf Port 443 SSL-Verbindungen entgegen nehmen wollen.<\/p>\n<pre lang=\"apache\">\r\nListen 127.0.0.1:443\r\n<\/pre>\n<p>oder andere Alternativen hierzu erledigen diese Aufgabe f\u00fcr uns. Soll auch hier die Kompatibilit\u00e4t und Flexibilit\u00e4t gew\u00e4hrleistet sein, so sollte dieser Block wie folgt lauten:<\/p>\n<pre lang=\"apache\">\r\n<IfModule mod_ssl.c>\r\n        <IfModule !mod_gnutls.c>\r\n                Listen 127.0.0.1:443\r\n        <\/IfModule>\r\n<\/IfModule>\r\n\r\n<IfModule mod_gnutls.c>\r\n        Listen 127.0.0.1:443\r\n<\/IfModule>\r\n<\/pre>\n<p>Hiernach nur noch daf\u00fcr sorgen, dass der Apache das Modul l\u00e4d, was aber mit Hilfe einer Shell mit zwei kurzen Befehlen erledigt ist:<\/p>\n<pre lang=\"bash\">\r\na2enmod gnutls\r\napache2ctl restart\r\n<\/pre>\n<p>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\u00e4tigen. 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:<\/p>\n<pre lang=\"bash\">\r\napache2ctl -t -D DUMP_VHOSTS\r\n<\/pre>\n<p>Sollte diese, wie in meinem Fall l\u00e4nger sein, hilft Folgendes:<\/p>\n<pre lang=\"bash\">\r\napache2ctl -t -D DUMP_VHOSTS 2>&1 | less\r\n<\/pre>\n<p>Ich hoffe, das hilft bei der Konfiguration des Servers als Einstieg.<\/p>\n<p class=\"wp-flattr-button\"><a href=\"https:\/\/blog.benny-baumann.de\/?flattrss_redirect&amp;id=273&amp;md5=bada1cafac0c92ba15e6e1c3ff12c32f\" title=\"Flattr\" target=\"_blank\"><img src=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" srcset=\"http:\/\/blog.benny-baumann.de\/wp-content\/plugins\/flattr\/img\/flattr-badge-large.png\" alt=\"Flattr this!\"\/><\/a><\/p>","protected":false},"excerpt":{"rendered":"<p>Ich habe ja die Tage \u00fcber diverse kaputte Pakete bei Debian rumgemeckert und dabei auch mod_gnutls mit erw\u00e4hnt, 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 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[4],"tags":[156,165,173,50],"class_list":["post-273","post","type-post","status-publish","format-standard","hentry","category-server","tag-apache","tag-gnutls","tag-konfiguration","tag-ssl"],"_links":{"self":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/273","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=273"}],"version-history":[{"count":1,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/273\/revisions"}],"predecessor-version":[{"id":274,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=\/wp\/v2\/posts\/273\/revisions\/274"}],"wp:attachment":[{"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=273"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=273"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.benny-baumann.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=273"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}