<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    
    <title>Netz - Rettung - Recht (Artikel mit Tag Apache)</title>
    <link>https://netz-rettung-recht.de/</link>
    <description>Netzleben, Rettungs- und Rechtswesen</description>
    <dc:language>de</dc:language>
    <generator>Serendipity 2.5.0 - http://www.s9y.org/</generator>
    <pubDate>Fri, 08 Sep 2017 06:54:15 GMT</pubDate>

    <image>
    <url>https://netz-rettung-recht.de/templates/2k11/img/s9y_banner_small.png</url>
    <title>RSS: Netz - Rettung - Recht - Netzleben, Rettungs- und Rechtswesen</title>
    <link>https://netz-rettung-recht.de/</link>
    <width>100</width>
    <height>21</height>
</image>

<item>
    <title>phpMyAdmin nur für einen vhost einbinden</title>
    <link>https://netz-rettung-recht.de/archives/2020-phpMyAdmin-nur-fuer-einen-vhost-einbinden.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2020-phpMyAdmin-nur-fuer-einen-vhost-einbinden.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2020</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2020</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;&lt;a href=&quot;https://www.phpmyadmin.net/&quot; title=&quot;phpMyAdmin&quot;&gt;&lt;em&gt;phpMyAdmin&lt;/em&gt;&lt;/a&gt; verwende ich seit über einem Jahrzehnt, um bequem auf die Datenbanken auf meinen verschiedenen Webspaces zugreifen zu können (und diesen Zugriff ggf. auch anderen Nutzern zu ermöglichen). Dabei nutze ich der Einfachheit halber das jeweilige Debian-Paket - je mehr Webapplikationen nicht gesondert aktualisiert werden müssen, desto besser.&lt;/p&gt;

&lt;p&gt;Die Standardinstallation hat - aus meiner Sicht - allerdings einen Nachteil: sie macht &lt;em&gt;phpMyAdmin&lt;/em&gt; für alle &lt;em&gt;vhosts&lt;/em&gt; verfügbar, d.h. unter allen auf dem Server gehosteten &amp;#8220;Domains&amp;#8221; aufrufbar. Manchmal mag das praktisch sein, wenn man bspw. so für jeden Kunden scheinbar &amp;#8220;sein&amp;#8221; &lt;em&gt;phpMyAdmin&lt;/em&gt; mitliefert; mir gefällt das aber nicht so gut, und sei es nur, weil &lt;em&gt;phpMyAdmin&lt;/em&gt; (wie jede verbreitete Webapplikation) regelmäßig &amp;#8220;angegriffen&amp;#8221; wird (sprich: Bots rufen die URL auf und suchen nach Schwachstellen oder versuchen, das Passwort zu erraten). Lieber würde ich &lt;em&gt;phpMyAdmin&lt;/em&gt; nur unter einer &amp;#8220;Domain&amp;#8221; - einem &lt;em&gt;vhost&lt;/em&gt; aufrufbar machen.&lt;/p&gt;

&lt;p&gt;Glücklicherweise lässt sich das ohne großen Aufwand machen.&lt;/p&gt;

&lt;p&gt;Standardmäßig legt Debian (Stretch) bei der Installation des Pakets eine entsprechende Konfiguration unter &lt;code&gt;/etc/apache2/conf-available/phpmyadmin.conf&lt;/code&gt; an und aktiviert sie durch einen Symlink in &lt;code&gt;/etc/apache2/conf-enabled/&lt;/code&gt;. Diese Datei hat folgenden Inhalt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# phpMyAdmin default Apache configuration

Alias /phpmyadmin /usr/share/phpmyadmin

&amp;lt;Directory /usr/share/phpmyadmin&amp;gt;
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php

    &amp;lt;IfModule mod_php5.c&amp;gt;
        &amp;lt;IfModule mod_mime.c&amp;gt;
            AddType application/x-httpd-php .php
        &amp;lt;/IfModule&amp;gt;
        &amp;lt;FilesMatch &quot;.+\.php$&quot;&amp;gt;
            SetHandler application/x-httpd-php
        &amp;lt;/FilesMatch&amp;gt;

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    &amp;lt;/IfModule&amp;gt;
    &amp;lt;IfModule mod_php.c&amp;gt;
        &amp;lt;IfModule mod_mime.c&amp;gt;
            AddType application/x-httpd-php .php
        &amp;lt;/IfModule&amp;gt;
        &amp;lt;FilesMatch &quot;.+\.php$&quot;&amp;gt;
            SetHandler application/x-httpd-php
        &amp;lt;/FilesMatch&amp;gt;

        php_value include_path .
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/php-gettext/:/usr/share/php/php-gettext/:/usr/share/javascript/:/usr/share/php/tcpdf/:/usr/share/doc/phpmyadmin/:/usr/share/php/phpseclib/
        php_admin_value mbstring.func_overload 0
    &amp;lt;/IfModule&amp;gt;

&amp;lt;/Directory&amp;gt;

# Authorize for setup
&amp;lt;Directory /usr/share/phpmyadmin/setup&amp;gt;
    &amp;lt;IfModule mod_authz_core.c&amp;gt;
        &amp;lt;IfModule mod_authn_file.c&amp;gt;
            AuthType Basic
            AuthName &quot;phpMyAdmin Setup&quot;
            AuthUserFile /etc/phpmyadmin/htpasswd.setup
        &amp;lt;/IfModule&amp;gt;
        Require valid-user
    &amp;lt;/IfModule&amp;gt;
&amp;lt;/Directory&amp;gt;

# Disallow web access to directories that don&#039;t need it
&amp;lt;Directory /usr/share/phpmyadmin/templates&amp;gt;
    Require all denied
&amp;lt;/Directory&amp;gt;
&amp;lt;Directory /usr/share/phpmyadmin/libraries&amp;gt;
    Require all denied
&amp;lt;/Directory&amp;gt;
&amp;lt;Directory /usr/share/phpmyadmin/setup/lib&amp;gt;
    Require all denied
&amp;lt;/Directory&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Entscheidend ist dabei die Zeile &lt;code&gt;Alias /phpmyadmin /usr/share/phpmyadmin&lt;/code&gt; - sie legt (global, da in der Serverkonfiguration eingebunden) für jeden &lt;em&gt;vhost&lt;/em&gt; einen Alias an, der beim Aufruf von &lt;code&gt;http://meine-domain.example/phpmyadmin/&lt;/code&gt; nun eben &lt;em&gt;phpMyAdmin&lt;/em&gt; anzeigt.&lt;/p&gt;

&lt;p&gt;Will man diese Funktionalität auf einen &lt;em&gt;vhost&lt;/em&gt; beschränken, genügt, es, die globale Konfiguration mit &lt;kbd&gt;a2disconf phpmyadmin&lt;/kbd&gt; abzuschalten und sie danach stattdessen in einen &lt;em&gt;vhost&lt;/em&gt; (oder auch mehrere) einzubinden:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost ${APACHE_IP4}:80 ${APACHE_IP6}:80&amp;gt;
    ServerName mein-vhost.example
    DocumentRoot /var/www/mein-vhost.example

    Include /etc/apache2/conf-available/phpmyadmin.conf
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sinnvoll mag es zudem sein, die Konfiguration nur für einen &lt;em&gt;vhost&lt;/em&gt; einzubinden, bei dem SSL aktiviert ist.&lt;/p&gt;

&lt;p&gt;Dann noch ein &lt;kbd&gt;service apache2 reload&lt;/kbd&gt; (oder &lt;kbd&gt;systemctl reload apache2&lt;/kbd&gt;, oder &lt;kbd&gt;apache2ctl graceful&lt;/kbd&gt;), und jetzt ist &lt;em&gt;phpMyAdmin&lt;/em&gt; nur noch unter &lt;code&gt;http://mein-vhost.example/phpmyadmin/&lt;/code&gt; abrufbar - und nirgendwo sonst.&lt;/p&gt;

&lt;p&gt;Wer ganz andere Lösungen umsetzen möchte als der Debian-Default es vorsieht (bspw. ein Aufruf über &lt;code&gt;https://phpmyadmin.mein-vhost.example/&lt;/code&gt;), der kann die Debian-Konfiguration schlicht als Ausgangspunkt nehmen und die entscheidenden Teile in einen passenden &lt;em&gt;vhost&lt;/em&gt; kopieren.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/bce22a9244b348fe870c8a469fce92fe&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 08 Sep 2017 06:50:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2020-guid.html</guid>
    <category>apache</category>
<category>debian</category>
<category>phpmyadmin</category>
<category>stretch</category>

</item>
<item>
    <title>Webserver-Tuning</title>
    <link>https://netz-rettung-recht.de/archives/2021-Webserver-Tuning.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2021-Webserver-Tuning.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2021</wfw:comment>

    <slash:comments>11</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2021</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Alle paar Monate wieder turnt ein - weniger rücksichtsvoller - Crawler vorbei und spidert sich zügig durch alle Einträge meines Blogs. Damit brachte er meinen bisherigen Server gerne an den Rand seiner Leistungsfähigkeit, durfte dieser doch für jeden Link einen &lt;code&gt;php-cgi&lt;/code&gt;-Prozess starten. Man merkte das recht schnell an den steigenden Antwortzeiten, und auch interaktiv auf der Shell machte sich die steigende &lt;em&gt;load&lt;/em&gt; bemerkbar. Am Ende blieben meist einige &lt;code&gt;php-cgi&lt;/code&gt;-Prozesse übrig, die man dann manuell mittels &lt;code&gt;kill&lt;/code&gt; entsorgen durfte. (Vielleicht lag auch hier das eigentliche Problem, dass nämlich die genutzten Ressourcen nicht wieder freigegeben wurden. Hinter die Einzelheiten bin ich nie so recht gekommen.)&lt;/p&gt;

&lt;p&gt;Die brandneue Maschine hingegen sollte durch &lt;em&gt;FastCGI&lt;/em&gt; und massenhaft RAM sowie schnelle SSDs einem solchen Ansturm (auch bei weiterer Verwendung des doch eher schwergewichtigen Apachen) besser gewachsen sein - dachte ich mir. Bis eines Freitagmorgens die E-Mails des Monitoring-System eingingen, die mir mitteilten, dass der Webserver nicht mehr auf Anfragen reagiert. Gar nicht mehr.&lt;/p&gt;

&lt;p&gt;Der Grund dafür fand sich schnell im Log:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[mpm_event:error] [pid 1365:tid 139856442496192] AH00484: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Alle Threads des Webservers waren mit Anfragen ausgelastet (und offensichtlich wurden sie auch nicht mehr freigegeben - oder der Apache hatte sich &amp;#8220;verschluckt&amp;#8221;). Ein &lt;kbd&gt;service apache2 restart&lt;/kbd&gt; löste daher das Problem; Zeit aber für einen Blick in die Konfiguration - vielleicht sollte man etwas an den Limits drehen (&amp;#8220;consider raising the MaxRequestWorkers setting
&amp;#8220;).&lt;/p&gt;

&lt;h3 id=&quot;apache-event-mpm&quot;&gt;Apache Event-MPM&lt;/h3&gt;

&lt;p&gt;Für das verwendete &lt;em&gt;MPM&lt;/em&gt; findet sich die entsprechende Konfiguration (unter Debian) in &lt;code&gt;/etc/apache2/mods-enabled/mpm_event.conf&lt;/code&gt;; sie sieht per default so aus:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# event MPM
# StartServers: initial number of server processes to start
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestWorkers: maximum number of worker threads
# MaxConnectionsPerChild: maximum number of requests a server process serves
&amp;lt;IfModule mpm_event_module&amp;gt;
       StartServers              2
       MinSpareThreads          25
       MaxSpareThreads          75
       ThreadLimit              64
       ThreadsPerChild          25
       MaxRequestWorkers       150
       MaxConnectionsPerChild    0
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Es werden also standardmäßig zwei Serverprozesse (&lt;code&gt;StartServers&lt;/code&gt;)gestartet; jeder hat 25 Threads (&lt;code&gt;ThreadsPerChild&lt;/code&gt;), also können 50 parallele Anfragen abgearbeitet werden. Sobald weniger als 25 freie Threads zur Verfügung stehen (&lt;code&gt;MinSpareThreads&lt;/code&gt;), werden weitere Serverprozesse gestartet, bis zum Maximum von 150 Threads (&lt;code&gt;MaxRequestWorkers&lt;/code&gt;) - das entspricht sechs Prozessen (mit je 25 Threads). Sobald mehr als 75 Threads unbeschäftigt sind (&lt;code&gt;MaxSpareThreads&lt;/code&gt;), werden Serverprozesse wieder zurückgefahren.&lt;/p&gt;

&lt;p&gt;150 Prozesse für eine Vielzahl von Webpräsenzen erschien mir wirklich nicht viel; ich habe (angesichts des zur Verfügung stehenden Speichers) daher etwas nachgelegt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mpm_event_module&amp;gt;
        ServerLimit               40
        StartServers               5
        MinSpareThreads          100
        MaxSpareThreads          250
        ThreadLimit               64     
        ThreadsPerChild           25
        MaxRequestWorkers       1000
        MaxConnectionsPerChild  1000
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Wir fangen jetzt also mit mit 125 Threads an (fünf Server mit je 25 Threads) und halten minimal 100 Threads bereit, maximal 250 - eine Lastspitze kann daher besser abgefedert werden, weil von Anfang an mehr Ressourcen bereitstehen und schneller zusätzliche Ressourcen hochgefahren werden). Maximal können dann 1.000 Threads laufen (statt vorher 150) - zu diesem Zweck muss auch &lt;code&gt;ServerLimit&lt;/code&gt; erhöht werden, das per Default auf 16 steht - denn 1.000 Threads brauchen bei 25 Threads pro Prozess 40 Prozesse (mit dem Default von 16 Prozessen kommt man daher maximal auf 400 Threads).&lt;/p&gt;

&lt;p&gt;Außerdem lasse icn jeden Thread nach 1.000 beantworteten Anfragen neu starten (&lt;code&gt;MaxConnectionsPerChild&lt;/code&gt;); so können sich Speicherlecks nicht zu Problemen auswachsen.&lt;/p&gt;

&lt;p&gt;Seitdem war der Webserver jedenfalls nicht mehr komplett ausgelastet; schauen wir mal, ob das schon der richtige Mittelweg zwischen der Bereitstellung ausreichender Ressourcen und dem Schutz des Gesamtsystems vor Überlast war oder mir als nächstes die ganze Maschine in die Knie geht, wenn es mal richtig rundgeht &amp;#8230;&lt;/p&gt;

&lt;h3 id=&quot;fpm-konfiguration&quot;&gt;FPM-Konfiguration&lt;/h3&gt;

&lt;p&gt;Für Webapplikationen in PHP ist die Apache-Konfiguration nicht das einzige limitierende Element - vielmehr muss jede Anfrage auch von einem &lt;em&gt;FastCGI&lt;/em&gt;-Prozess beantwortet werden, und auch die sind limitiert: per Default (bei Debian) auf 50 pro Pool, konfiguriert (unter Strech) in &lt;code&gt;/etc/php/7.0/fpm/pool.d/www.conf&lt;/code&gt;, wobei statt &lt;code&gt;www.conf&lt;/code&gt; eben der jeweilige Pool einzusetzen ist.&lt;/p&gt;

&lt;p&gt;Das erscheint mir ebenfalls nicht besonders viel; ich habe daher den Pool für mein Blog etwas nach oben angepasst:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pm.max_children = 250
pm.start_servers = 30
pm.min_spare_servers = 10
pm.max_spare_servers = 50
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Zu lesen ist das ähnlich wie oben beim Apachen: 30 Prozesse stehen von Anfang an zur Verfügung, 10&amp;#160;müssen mindestens immer arbeitslos sein, sonst werden Prozesse nachgelegt, bis zur Maximalzahl von 250. Ab 50 &amp;#8220;arbeitslosen&amp;#8221; Prozessen werden überzählige Prozesse gestoppt.&lt;/p&gt;

&lt;h3 id=&quot;erfahrungswerte&quot;&gt;Erfahrungswerte&lt;/h3&gt;

&lt;p&gt;Ich habe bisher, muss ich gestehen, nicht die geringste Erfahrung mit solchen &amp;#8220;Tuning-Aufgaben&amp;#8221;, und werde daher abwarten müssen, ob sich die Werte bewähren. Aus dem Log kann ich jedenfalls sehen, dass 50 Prozesse viel zu wenig waren und auch 150 mehrfach nicht ausreichten:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;WARNING: [pool blog] server reached pm.max_children setting (150), consider raising it
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Andererseits habe ich bisher zumindest aus &lt;em&gt;Munin&lt;/em&gt; - das allerdings nicht sehr fein auflöst - keine Hinweise für Lastspitzen (CPU-Nutzung, RAM-Nutzung und Load); da scheint im Tagesverlauf überall noch viel, viel Luft nach oben zu sein.&lt;/p&gt;

&lt;p&gt;Hat jemand aus der werten Leserschaft Erfahrungen und Tips, die er gerne teilen möchte? Sonst berichte ich, wenn das nächste Mal etwas danebengeht. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/87d9555e0645490ebf5eee951e24a9ff&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Tue, 22 Aug 2017 05:40:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2021-guid.html</guid>
    <category>apache</category>
<category>debian</category>
<category>followerpower</category>
<category>php</category>
<category>stretch</category>

</item>
<item>
    <title>Let's Encrypt und Basic-Auth</title>
    <link>https://netz-rettung-recht.de/archives/2010-Lets-Encrypt-und-Basic-Auth.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/2010-Lets-Encrypt-und-Basic-Auth.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=2010</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=2010</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Wie man mit &lt;em&gt;Let’s Encrypt&lt;/em&gt; ganz einfach an SSL-Zertifikate kommt, hatte ich bereits vor mehr als einem Jahr &lt;a href=&quot;https://netz-rettung-recht.de/archives/1903-SSLTLS-mit-Lets-Encrypt.html&quot; title=&quot;SSL/TLS mit Let&#039;s Encrypt | Netz - Rettung - Recht&quot;&gt;geschildert&lt;/a&gt; - mittlerweile übrigens ganz einfach, denn in Debian &lt;em&gt;stretch&lt;/em&gt; ist der &lt;em&gt;Let’s Encrypt&lt;/em&gt;-Client (der jetzt &lt;em&gt;certbot&lt;/em&gt; heißt) nativ dabei und bringt jetzt auch einen fertigen &lt;em&gt;Cronjob&lt;/em&gt; mit.&lt;/p&gt;

&lt;p&gt;Aber darum soll es heute gar nicht gehen, sondern vielmehr um die Frage, wie man &lt;em&gt;Let’s Encrypt&lt;/em&gt; verwenden kann, wenn die entsprechende Webpräsenz mit einem einfachen Passwortschutz - der &lt;em&gt;basic access authentication&lt;/em&gt; oder kurz Basic-Auth - versehen ist. Jeder kennt vermutlich das Popup, das nach Benutzerkennung und Passwort fragt; eine nicht sehr elegante, aber dafür mit praktisch keinem Aufwand verbundene Lösung, die zudem &lt;em&gt;alle&lt;/em&gt; Dateien in allen Verzeichnissen der Präsenz schützt, nicht nur Scripts, sondern auch - bspw. - Bilder.
Eleganter ist natürlich eine ordentliche Session-Verwaltung mit Login- und Logout-Funktion; aber manchmal soll eben nur die private Bildergalerie oder eine &amp;#8220;fertige&amp;#8221; Applikation geschützt werden, die von Haus aus keinen Passwortschutz mitbringt. Ein schneller Eintrag in der &lt;code&gt;.htaccess&lt;/code&gt;-Datei oder der Serverkonfiguration im passenden &lt;em&gt;virtual host&lt;/em&gt;, und schon ist alles (ein wenig) gesichert:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;AuthUserFile /home/USER/.htpasswd
    AuthName &#039;Privater Bereich&#039;
    AuthType Basic
    Require valid-user
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nur wirkt dieser Schutz eben auch gegen &lt;em&gt;Let’s Encrypt&lt;/em&gt;, das durch den Aufruf einer temporär erzeugten Datei im Verzeichnis &lt;code&gt;http://domain.example/.well-known/&lt;/code&gt; überprüft, ob der Antragsteller wirklich die Kontrolle über den entsprechenden Host hat. Dieser Aufruf schlägt fehl, wenn ein Passwort erforderlich ist. Natürlich könnte man jetzt jedes Mal, wenn das Zertifikat zu erneuern ist, den Passwortschutz kurzzeitig deaktivieren, aber das ist weder praktikabel (schließlich gelten die Zertifikate nur wenige Monate und sollen selbständig erneuert werden) noch sicher (was ist, wenn gerade in diesem Moment jemand die geschützte Webseite aufgerufen hat?).&lt;/p&gt;

&lt;p&gt;Die Lösung ist aber hinreichend einfach: es genügt, das Vezeichnis &lt;code&gt;/.well-known&lt;/code&gt; vom Passwortschutz auszunehmen. Und das funktioniert mit folgenden Zeilen im &lt;em&gt;virtual host&lt;/em&gt; (Apache 2.4):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;Location /.well-known&amp;gt;
    Require all granted
&amp;lt;/Location&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nach einem &lt;code&gt;service apache2 reload&lt;/code&gt; (oder dem Äquivalent des jeweiligen Systems) arbeitet &lt;em&gt;Let’s Encrypt&lt;/em&gt; wieder so, wie es soll, und der Rest der Webpräsenz ist weiterhin passwortgeschützt.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/b058cf877c5040f18800d01067c17587&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 07 Aug 2017 05:55:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/2010-guid.html</guid>
    <category>apache</category>
<category>ssl</category>

</item>
<item>
    <title>SSL/TLS für Fortgeschrittene</title>
    <link>https://netz-rettung-recht.de/archives/1904-SSLTLS-fuer-Fortgeschrittene.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1904-SSLTLS-fuer-Fortgeschrittene.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1904</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1904</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Hat man dem eigenen Webserver erfolgreich &lt;a href=&quot;https://netz-rettung-recht.de/archives/1901-Der-eigene-Webserver-mit-SSLTLS.html&quot; title=&quot;&quot;&gt;SSL beigebracht&lt;/a&gt; und für ein valides Zertifikat gesorgt, bspw. &lt;a href=&quot;https://netz-rettung-recht.de/archives/1903-SSLTLS-mit-Lets-Encrypt.html&quot; title=&quot;&quot;&gt;mithilfe von &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt;&lt;/a&gt;, finden sich in der Konfigurationsdatei (bei Debian: &lt;code&gt;/etc/apache2/mods-available/ssl.conf&lt;/code&gt;) noch etliche Schrauben und Rädchen, an denen man drehen kann.&lt;/p&gt;

&lt;h3 id=&quot;ssl-protokolle&quot;&gt;SSL-Protokolle&lt;/h3&gt;

&lt;p&gt;Unter anderem lassen sich dort die Protokolle angeben, die der Server anbieten soll. &amp;#8220;SSL&amp;#8221; (bzw. &amp;#8220;TLS) steht nämlich nicht für ein einzelnes Übertragungsprotokoll, sondern für eine ganze &lt;a href=&quot;https://en.wikipedia.org/wiki/Transport_Layer_Security#History_and_development&quot; title=&quot;&quot;&gt;Protokollfamilie&lt;/a&gt;, nämlich&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSL 2.0&lt;/li&gt;
&lt;li&gt;SSL 3.0&lt;/li&gt;
&lt;li&gt;TLS 1.0&lt;/li&gt;
&lt;li&gt;TLS 1.1&lt;/li&gt;
&lt;li&gt;TLS 1.2&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;TLS 1.3 wird derzeit gerade entwickelt.&lt;/p&gt;

&lt;p&gt;Gegen SSLv2 und SSLv3 sind mögliche Angriffe bekannt, weshalb ein Server diese Protokolle nach Möglichkeit nicht mehr anbieten sollte, soweit nicht ältere Software darauf noch angewiesen ist. &lt;em&gt;Firefox&lt;/em&gt;, &lt;em&gt;Chrome&lt;/em&gt; und &lt;em&gt;Safari&lt;/em&gt; unterstützen mindestens TLS 1.0 von jeher, &lt;em&gt;Internet Explorer&lt;/em&gt; kann das jedenfalls ab IE7 und &lt;em&gt;Opera&lt;/em&gt; ab Version 5 - das sollte also in der Regel kein Grund sein, darauf zu verzichten.&lt;/p&gt;

&lt;p&gt;So kann das dann aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SSLProtocol all -SSLv2 -SSLv3
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Der &lt;em&gt;Apache 2.4&lt;/em&gt; (bzw. die verwendete OpenSSL-Version) unter &lt;em&gt;Debian Jessie&lt;/em&gt; bietet &lt;code&gt;SSLv2&lt;/code&gt; ohnehin nicht mehr an; dort genügt es also, &lt;code&gt;SSLv3&lt;/code&gt; zu verbieten.&lt;/p&gt;

&lt;h3 id=&quot;algorithmen&quot;&gt;Algorithmen&lt;/h3&gt;

&lt;p&gt;Für den Schlüsselaustausch zwischen Server und Client müssen die beiden sich auf eine Methode einigen und dann noch auswählen, mit welchem Chiffrieralgorithmus die Verbindung gesichert werden soll.&lt;/p&gt;

&lt;p&gt;Mathematik und Kryptographie entwickeln sich ebenso fort wie sich die Leistungsfähigkeit von Computern steigert - was gestern noch ausreichend sicher war, ist es morgen vielleicht nicht mehr. Es lohnt sich also, auch hierüber ein wenig nachzudenken - was nützt die schönste verschlüsselte Verbindung, wenn sie trivial zu knacken ist, nicht nur durch Geheimdienste und Strafverfolgungsbehörden, sondern auch durch andere, böswillige Dritte?&lt;/p&gt;

&lt;p&gt;Nun kann man sich entweder selbst in das Thema einlesen - und sollte das auch, wenn man es interessant findet oder es einem wichtig ist -, oder man vertraut Lösungen, die Dritte einem empfehlen. Egal was man tut, man sollte die SSL-Verbindung danach testen lassen und - ggf. - die Last im Auge behalten, wenn man aufwändigere, aber sicherere Algorithmen anbietet und an den Anfang der Liste stellt.&lt;/p&gt;

&lt;p&gt;Eine Möglichkeit, die angebotenen &lt;em&gt;Cipher Suites&lt;/em&gt; zu beschränken und ihre Reihenfolge zu sortieren, wäre die folgende:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SSLCipherSuite &#039;EECDH+ECDSA+AESGCM:EECDH+aRSA+AESGCM:EECDH:EDH:HIGH:+RSA:+SHA:MEDIUM:!aNULL:!MD5:!eNULL:!LOW:!EXP:!DSS:!PSK:!SRP:!RC4:!CAMELLIA&#039;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;(Ich mache hier &lt;em&gt;copy &amp;amp; paste&lt;/em&gt; - Kommentare dazu gerne, nun ja, in den Kommentaren.)&lt;/p&gt;

&lt;p&gt;Server und Client einigen sich dann auf eine der von beiden unterstützten Möglichkeiten, normalerweise anhand der Präferenzen, die der Client her, auf Wunsch aber auch in der Reihenfolge, in der die &lt;em&gt;Cipher Suites&lt;/em&gt; vorstehend - also in der Serverkonfiguration - angegeben sind. Für letzteres ist der Parameter &lt;code&gt;SSLHonorCipherOrder&lt;/code&gt; auf &amp;#8220;on&amp;#8221; zu setzen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;SSLHonorCipherOrder on
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;-forward-secrecy-&quot;&gt;&lt;em&gt;Forward secrecy&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Unter &lt;em&gt;Forward secrecy&lt;/em&gt; versteht man (vereinfacht ausgedrückt), dass der zwischen Server und Client ausgehandelte temporäre Sitzungsschlüssel, mit dem Datenverbindung verschlüsselt wird, sich nicht aus den verwendeten Zertifikaten ableiten lässt. Ohne &lt;em&gt;forward secrecy&lt;/em&gt; kann jemand, der sich den privaten Schlüssel des Servers verschafft, nicht nur alle danach aufgebauten Verbindungen live mitlesen, er kann ggf. auch alle vorherigen (!) Verbindungen nachträglich entschlüsseln, wenn er sie mitgeschnitten hat. Die Gefährdung der zukünftigen Verbindungen kann man durch einen Schlüsseltausch verhindern, wenn und sobald man bemerkt hat, dass der private Schlüssel des Servers kompromittiert wurde. Man kann ohne &lt;em&gt;forward secrecy&lt;/em&gt; aber nicht verhindern, dass aufgezeichnete frühere Verbindungen komplett entschlüsselbar werden.&lt;/p&gt;

&lt;p&gt;Nicht jeder für den Schlüsselaustausch verwendbare Algorithmus bietet &lt;em&gt;forward secrecy&lt;/em&gt;; in dem oben gegebenen Beispiel stehen die Algorithmen, die es tun, aber vorne in der Liste (&lt;code&gt;DHE&lt;/code&gt; und &lt;code&gt;ECDHE&lt;/code&gt;).&lt;/p&gt;

&lt;h3 id=&quot;weitere-parameter-und-einstellungsm-glichkeiten&quot;&gt;Weitere Parameter und Einstellungsmöglichkeiten&lt;/h3&gt;

&lt;p&gt;Das Thema SSL/TLS ist komplex, und ich bin kein Spezialist dafür; daher kann ich hier nur darauf verweisen, dass es weitere, potentiell relevante Parameter gibt, die sich der Dokumentation und einschlägigen Webseiten entnehmen lassen.&lt;/p&gt;

&lt;p&gt;Debian bietet zudem in den Dateien &lt;code&gt;/etc/apache2/mods-available/ssl.conf&lt;/code&gt; (globale Konfiguration) und &lt;code&gt;/etc/apache2/sites-available/default-ssl&lt;/code&gt; (Konfiguration pro &lt;em&gt;virtual host&lt;/em&gt;) einigermaßen umfangreiche Kommentare zur Erläuterung einiger (mutmaßlich: der wichtigsten) Optionen an.&lt;/p&gt;

&lt;p&gt;Eine soll hier noch erwähnt werden: &lt;code&gt;SSLStrictSNIVHostCheck&lt;/code&gt;. &amp;#8220;Off&amp;#8221; bedeutet, dass ein Client, der kein &lt;em&gt;SNI&lt;/em&gt; beherrscht, dann eben immer das Zertifikat des Default-&lt;em&gt;vhost&lt;/em&gt; präsentiert bekommt, das dann in der Regel nicht zum Domainnamen passt, den er aufrufen wollte. &amp;#8220;On&amp;#8221; bedeutet, dass diese Clients dann nicht - via SSL - auf den entsprechenden &lt;em&gt;vhost&lt;/em&gt; oder - wenn es in der Serverkonfiguration oder im Default-&lt;em&gt;vhost&lt;/em&gt; gesetzt wird - auf irgendeinen &lt;em&gt;vhost&lt;/em&gt; zugreifen können.&lt;/p&gt;

&lt;h4 id=&quot;weitere-berlegungen&quot;&gt;Weitere Überlegungen&lt;/h4&gt;

&lt;p&gt;Neben der SSL-Konfiguration sollte der sicherheitsbewusste Serverbertreiber bzw. Webapplikationsentwickler auch noch einige andere Themen im Blick behalten:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Werden Cookies so gesetzt, dass ihr Inhalt nur über eine veschlüsselte Verbindung an den Server gesandt wird?&lt;br /&gt;
Stichwort: &lt;em&gt;&lt;a href=&quot;https://www.owasp.org/index.php/SecureFlag&quot; title=&quot;301 Moved Permanently&quot;&gt;secure cookie&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Empfiehlt es sich, den Server bestimmte sicherheitsrelevante &lt;em&gt;HTTP-Header&lt;/em&gt; übertragen zu lassen, und welche Bedeutung haben diese jeweils?&lt;br /&gt;
Stichwort: &lt;em&gt;&lt;a href=&quot;https://www.owasp.org/index.php/List_of_useful_HTTP_headers&quot; title=&quot;301 Moved Permanently&quot;&gt;security (related) headers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wie ist sichergestellt, dass ein abhanden gekommenes oder aus anderen Gründen widerrufenes Zertifikat
nicht mehr als gültig akzeptiert wird?
Stichworte: &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Revocation_list&quot; title=&quot;&quot;&gt;Certificate Revocation List&lt;/a&gt;&lt;/em&gt; (&lt;em&gt;CRL&lt;/em&gt;) und &lt;em&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol&quot; title=&quot;&quot;&gt;Online Certificate Status Protocol&lt;/a&gt;&lt;/em&gt; (&lt;em&gt;OCSP&lt;/em&gt;)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zu dem angerissenen Thema der &lt;em&gt;HTTP-Header&lt;/em&gt; gehört u.a. auch &lt;strong&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security&quot; title=&quot;&quot;&gt;HTTP Strict Transport Security&lt;/a&gt;&lt;/strong&gt;, kurz &lt;em&gt;HSTS&lt;/em&gt;, mit dem der Server dem Client mitteilt, dass er derzeit und auch für die Zukunft (jedenfalls in dem durch den Server genannten Zeitraum) die Verbindung zu diesem Hostnamen (&amp;#8220;Domain&amp;#8221;) nur per HTTPS herstellen soll.&lt;/p&gt;

&lt;p&gt;Wie ich bereits mehrfach betonte: ein weites Feld, und nicht unbedingt meines. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;ssl-verbindungen-testen-und-bewerten&quot;&gt;SSL-Verbindungen testen und bewerten&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://ssllabs.com/&quot; title=&quot;301 Moved Permanently&quot;&gt;SSL Labs&lt;/a&gt;&lt;/strong&gt; bietet einen Onlinetest für die Konfiguration des Servers und des Browsers an. Ruft man den Test (bspw.) für &lt;a href=&quot;https://www.ssllabs.com/ssltest/analyze.html?d=netz-rettung-recht.de&quot; title=&quot;SSL Server Test: netz-rettung-recht.de (Powered by Qualys SSL Labs)&quot;&gt;dieses Blog&lt;/a&gt; auf, werden alle möglichen Parameter getestet - ja, das dauert eine Weile - und dann mit einer Schulnote (im amerikanischen System) von A-F bewertet, wobei A die beste, F die schlechteste Note darstellt. Außerdem erhält man eine Vielzahl von auch mit Links hinterlegten Hinweisen auf Schwachstellen und Verbesserungsmöglichkeiten.&lt;/p&gt;

&lt;p&gt;Wer lieber auf der Kommandozeile arbeitet, lädt sich am besten &lt;strong&gt;&lt;a href=&quot;http://testssl.sh/&quot; title=&quot;302 Found&quot;&gt;testssl.sh&lt;/a&gt;&lt;/strong&gt; von &lt;a href=&quot;https://github.com/drwetter&quot; title=&quot;drwetter (Dirk Wetter) · GitHub&quot;&gt;Dirk Wetter&lt;/a&gt; herunter.&lt;/p&gt;

&lt;p&gt;Wer hingegen wissen will, welche sicherheitsrelevanten &lt;em&gt;HTTP-Header&lt;/em&gt; sein Server überträgt, ist bei &lt;strong&gt;&lt;a href=&quot;https://securityheaders.io/&quot; title=&quot;&quot;&gt;securityheaders.io&lt;/a&gt;&lt;/strong&gt; gut aufgehoben. Auch hier gibt es Schulnoten zur Bewertung.&lt;/p&gt;

&lt;p&gt;Auch &lt;a href=&quot;https://ssl-tools.net/&quot; title=&quot;SSL, STARTTLS and Zertifikate prüfen · SSL-Tools&quot;&gt;SSL-Tools&lt;/a&gt; bietet eine Vielzahl von Test, auch für Mailserver, hat allerdings offenbar noch die eine oder andere &lt;a href=&quot;http://lutz.donnerhacke.de/Blog/Das-kann-jedem-passieren&quot; title=&quot;302 Found&quot;&gt;Schwäche&lt;/a&gt; jedenfalls im User Interface &amp;#8230;&lt;/p&gt;

&lt;h3 id=&quot;disclaimer&quot;&gt;Disclaimer&lt;/h3&gt;

&lt;p&gt;Die Einzelheiten rund um Protokolle, Algorithmen und Parameter, sozusagen die Eingeweise der TLS-Implementationen, sind weit davon entfernt, mein Spezialgebiet zu sein. Dankenswerterweise hatte ich kompetente Korrekturleser, aber etwaiger verbliebener Blödsinn bleibt mein Verschulden und mag in den Kommentaren korrigiert werden, in denen ich auch gerne Ergänzungen entgegennehme.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/cac032569eb14406a4a9d3f3ab29f144&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 14 Apr 2016 05:45:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1904-guid.html</guid>
    <category>apache</category>
<category>ssl</category>

</item>
<item>
    <title>SSL/TLS mit Let's Encrypt</title>
    <link>https://netz-rettung-recht.de/archives/1903-SSLTLS-mit-Lets-Encrypt.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1903-SSLTLS-mit-Lets-Encrypt.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1903</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1903</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Bereits &lt;a href=&quot;https://netz-rettung-recht.de/archives/1901-Der-eigene-Webserver-mit-SSLTLS.html&quot; title=&quot;&quot;&gt;vergangene Woche&lt;/a&gt; berichtete ich von meinen Irrungen und Wirrungen des letzten Jahrzehnts mit SSL/TLS im Web. Erst Ende 2015 hatte ich mich aufgerafft, über &lt;a href=&quot;https://www.startssl.com/&quot; title=&quot;Notice to all StartCom subscribers&quot;&gt;StartCom&lt;/a&gt; für einige Domains Zertifikate erstellen zu lassen, und parallel die Berichterstattung über &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; verfolgt.&lt;/p&gt;

&lt;p&gt;Der Workflow für die Erstellung und Pflege von HTTPS-Zertifikaten kann schnell komplex werden:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Am Anfang steht die Erzeugung eines Schlüsselpaares, denn das spätere Zertifikat wird nur derjenige verwenden können, der auch den passenden privaten Schlüssel hat.&lt;/li&gt;
&lt;li&gt;Dann ist für jedes Zertifikat ein &lt;em&gt;Certificate Signing Request&lt;/em&gt; (&lt;em&gt;CSR&lt;/em&gt;) zu erstellen; das ist quasi die Roh-Form des späteren Zertifikats mit den notwendigen Informationen, die darin enthalten sein sollen.&lt;/li&gt;
&lt;li&gt;Dieser &lt;em&gt;CSR&lt;/em&gt; muss dann von der Zertifierungsstelle (Certificate Authority, &lt;em&gt;CA&lt;/em&gt;) digital signiert werden.&lt;/li&gt;
&lt;li&gt;Das so entstandene Zertifikat muss gespeichert und in die Webserver-Konfiguration eingebunden werden.&lt;/li&gt;
&lt;li&gt;Der ganze Ablauf ist nur zielführend, wenn die &lt;em&gt;CA&lt;/em&gt; von den verbreiteten Browsern anerkannt ist, den von ihr signierten Zertifikaten also vertraut wird. Dafür wollen die meisten &lt;em&gt;CAs&lt;/em&gt; Geld. Zudem müssen sie sich über einen mehr oder weniger aufwendigen Weg zumindest vergewissern, dass derjenige, der ein Zertifikat für einen bestimmten Hostnamen ausgestellt haben möchte, über diesen auch verfügen kann.&lt;/li&gt;
&lt;li&gt;Zertifikate werden in der Regel nur für einen begrenzten Zeitraum - meistens ein Jahr - ausgestellt. Danach müssen sie (rechtzeitig!) verlängert werden.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;a href=&quot;https://letsencrypt.org/&quot; title=&quot; Let&amp;#39;s Encrypt&quot;&gt;Let&amp;#8217;s Encrypt&lt;/a&gt;&lt;/em&gt; ist angetreten, diese Abläufe weitestmöglich zu vereinfachen.&lt;/p&gt;

&lt;h3 id=&quot;-let-s-encrypt-die-prinzipien&quot;&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; - die Prinzipien&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; arbeitet kostenlos und veröffentlicht die verwendeten Schnittstellen. Es stellt eine &lt;em&gt;CA&lt;/em&gt; zur Verfügung, die automatisch Zertifikate ausstellt, nachdem sie überprüft hat, dass der Anfragende die administrative Kontrolle über den entsprechenden Hostnamen hat - beispielsweise, indem &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; verlangt, dass eine bestehende Datei auf dem Webserver unter diesem Hostnamen hinterlegt wird. Die erstellten Zertifikate werden öffentlich gemacht; es kann also jeder jederzeit nachvollziehen, wann &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; welche Zertifikate erstellt hat.&lt;/p&gt;

&lt;p&gt;Mittlerweile ist das Zwischenzertifikat von &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; nicht nur durch &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; selbst, sondern auch durch eine andere &lt;em&gt;CA&lt;/em&gt; (&lt;em&gt;IdenTrust&lt;/em&gt;) signiert und wird daher regelmäßig von den Browsern als vertrauenswürdig anerkannt. Von &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; ausgestellte Zertifikate werden also akzeptiert und führen nicht zu irgendwelchen Warnmeldungen. Sie gelten allerdings nur rund 90 Tage und müssen dann erneut werden.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; stellt Client-Software zur Verfügung, die den gesamten, einleitend dargestellten Workflow automatisiert, ermöglicht es aber auch, die notwendigen Schritte in beliebigem Umfang manuell nachzuvollziehen oder auch eigene Lösungen zu programmieren. Im vollautomatischen Modus erstellt &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; das notwendige Schlüsselpaar und den &lt;em&gt;CSR&lt;/em&gt;, überprüft, dass der Antragsteller den Hostnamen kontrolliert, stellt das Zertifikat aus und speichert es, passt die Webserver-Konfiguration an und bindet das Zertifikat ein und kann auf Wunsch rechtzeitig vor Ablauf ein neues Zertifikat erstellen.&lt;/p&gt;

&lt;h3 id=&quot;-let-s-encrypt-und-der-apache-webserver-unter-debian-jessie-&quot;&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; und der &lt;em&gt;Apache&lt;/em&gt;-Webserver unter &lt;em&gt;Debian Jessie&lt;/em&gt;&lt;/h3&gt;

&lt;p&gt;Im Anschluss möchte ich einen weitgehend, aber nicht völlig automatisierten Ablauf zum Erstellen von SSL-Zertifikaten und deren Einbindung in einen &lt;em&gt;Apache&lt;/em&gt; unter &lt;em&gt;Debian Jessie&lt;/em&gt; darstellen. Es ist durchaus möglich, weit weniger auf Automatismen zu setzen; dann muss der Client auch nicht zwingend mit Root-Rechten laufen. &lt;em&gt;Matthias Gutjahr&lt;/em&gt; schildert in seinem Blog eine Möglichkeit dafür; &lt;em&gt;Dirk Deimeke&lt;/em&gt; hat eine weitere Alternative dargestellt. Beide Beiträge sind am Ende dieses Blogbeitrags verlinkt.&lt;/p&gt;

&lt;h4 id=&quot;installation&quot;&gt;Installation&lt;/h4&gt;

&lt;p&gt;Ab &lt;em&gt;Jessie&lt;/em&gt;, der derzeit stabilen &lt;em&gt;Debian&lt;/em&gt;-Version, steht &lt;code&gt;letsencrypt&lt;/code&gt; als Paket zur Verfügung, allerdings nur in den Backports. Wenn sich in der &lt;code&gt;/etc/apt/sources.list&lt;/code&gt; also die Zeile &lt;code&gt;deb http://ftp.debian.org/debian jessie-backports main&lt;/code&gt; findet, ist die Installation daher denkbar einfach:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;apt-get -t jessie-backports install letsencrypt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Die umfangreichen Abhängigkeiten werden mitinstalliert.&lt;/p&gt;

&lt;p&gt;Wer noch unter &lt;em&gt;Wheezy&lt;/em&gt; arbeitet, benötigt etwas mehr Vertrauen in die Macher von &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; - und Platz für ein umfangreicheres Software-Paket (&lt;code&gt;letsencrypt-auto&lt;/code&gt;), das u.a. eine komplette virtuelle &lt;em&gt;Python&lt;/em&gt;-Umgebung mit sich schleppt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cd /usr/local
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./letsencrypt-auto --help
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;code&gt;letsencrypt-auto&lt;/code&gt; akzeptiert dann denselben Input wie &lt;code&gt;letsencrypt&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;zertifikat-erstellen-lassen&quot;&gt;Zertifikat erstellen lassen&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;letsencrypt&lt;/code&gt; bietet eine &lt;code&gt;ncurses&lt;/code&gt;-Oberfläche, die es ermöglicht, auf einige Kommandozeilen-Parameter zu verzichten und ggf. notwendige Abfragen im Dialog zu beantworten. Dazu gehört beim ersten Start u.a. die Angabe einer E-Mail-Adresse für eine mögliche Kontaktaufnahme und die Bestätigung der AGB, die erforderlich ist. Danach erstellt &lt;code&gt;letsencrypt&lt;/code&gt; automatisch einen Account samt Schlüsselpaar, so dass weitere Aufrufe in der Regel ohne Interaktion ablaufen können.&lt;/p&gt;

&lt;p&gt;Alle Daten werden standardmäßig unter &lt;code&gt;/etc/letsencrypt/&lt;/code&gt; abgelegt.&lt;/p&gt;

&lt;p&gt;Der folgende Aufruf fordert ein Zertifikat für die Hostnamen &lt;code&gt;domain.example&lt;/code&gt; und &lt;code&gt;www.domain.example&lt;/code&gt; an, deren Dateien auf der Platte im Verzeichnis &lt;code&gt;/var/www/domain.example&lt;/code&gt; (&lt;em&gt;Webroot&lt;/em&gt;) liegen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;letsencrypt certonly --webroot -w /var/www/domain.example/ -d domain.example -d www.domain.example
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Falls notwendig, werden Mailadresse und Zustimmung zu den AGB (&amp;#8220;Terms of Service&amp;#8221;, &amp;#8220;TOS&amp;#8221;) abgefragt und ein privater Schlüssel (bzw. das Schlüsselpaar) erstellt. Dann wird der &lt;em&gt;CSR&lt;/em&gt; an &lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt; geschickt, temporär eine unter &lt;code&gt;http://domain.example/&lt;/code&gt; abrufbare Datei im &lt;em&gt;Webroot&lt;/em&gt; erstellt und so geprüft, dass man wirklich die Kontrolle über diesen Hostnamen hat, das Zertifikat erstellt, unter &lt;code&gt;/etc/letsencrypt/archive/domain.example/&lt;/code&gt; gespeichert und ein Symlink von &lt;code&gt;/etc/letsencrypt/live/domain.example/&lt;/code&gt; nach dort erstellt.&lt;/p&gt;

&lt;p&gt;Soll das Zertifikat für weitere Hostnamen gelten, können beliebig viele Folgen von &lt;code&gt;-w webroot -d hostname&lt;/code&gt; angeschlossen werden. Es folgt jeweils auf das &lt;code&gt;-w webroot&lt;/code&gt; die Angabe der Hostnames, die zu diesem Webroot gehören.&lt;/p&gt;

&lt;h4 id=&quot;zertifikat-beim-apache-einbinden&quot;&gt;Zertifikat beim &lt;em&gt;Apache&lt;/em&gt; einbinden&lt;/h4&gt;

&lt;p&gt;Eine minimale Konfiguration für den &lt;em&gt;virtual host&lt;/em&gt; könnte im &lt;em&gt;Apache 2.4&lt;/em&gt; (&lt;em&gt;Debian Jessie&lt;/em&gt;) so aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:443&amp;gt;
    ServerName domain.example
    ServerAlias www.domain.example

    DocumentRoot /var/www/domain.example

    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/domain.example/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain.example/privkey.pem
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Der &lt;em&gt;Apache 2.2&lt;/em&gt;, der mit &lt;em&gt;Debian Wheezy&lt;/em&gt; ausgeliefert wird, muss Zertifikat und Zwischenzertifikat der &lt;em&gt;CA&lt;/em&gt; getrennt ausliefern:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:443&amp;gt;
    [...]
    SSLEngine on
    SSLCertificateFile /etc/letsencrypt/live/domain.example/cert.pem
    SSLCertificateChainFile /etc/letsencrypt/live/domain.example/chain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/domain.example/privkey.pem
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h4 id=&quot;zertifikate-erneuern&quot;&gt;Zertifikate erneuern&lt;/h4&gt;

&lt;p&gt;Folgender &lt;em&gt;Cronjob&lt;/em&gt; prüft täglich um 4 Uhr morgens, ob ein Zertifikat erneuert werden muss, und nimmt diese Erneuerung automatisch vor, wenn sich der Ablaufzeitpunkt nähert:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;00 4 * * * letsencrypt renew --keep-until-expiring
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;weiterer-lesestoff&quot;&gt;Weiterer Lesestoff&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt;: &lt;a href=&quot;https://letsencrypt.org/getting-started/&quot; title=&quot;Getting Started -  Let&amp;#39;s Encrypt&quot;&gt;Getting Started&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Wouter Verhelst im &lt;em&gt;WEBlog — Wouter’s Eclectic Blog&lt;/em&gt;: &lt;a href=&quot;http://grep.be/blog//en/computer/play/Playing_with_Letsencrypt/&quot; title=&quot;301 Moved Permanently&quot;&gt;Playing with Letsencrypt&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Matthias Gutjahr im &lt;em&gt;Sperrobjekt Weblog&lt;/em&gt;: &lt;a href=&quot;http://blog.sperrobjekt.de/content/1000480-Lets-Encrypt-Zertifikate-manuell-erzeugen.html&quot; title=&quot;&quot;&gt;&lt;em&gt;Let&amp;#8217;s Encrypt&lt;/em&gt;-Zertifikate manuell erzeugen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dirk Deimeke in &lt;em&gt;Dirks Logbuch&lt;/em&gt;: &lt;a href=&quot;http://www.deimeke.net/dirk/blog/index.php?/archives/3681-Lets-Encrypt-....html&quot; title=&quot;302 Found&quot;&gt;Let&amp;#8217;s Encrypt &amp;#8230;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/051a5cf219b94e51bbfd314bc7089125&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Mon, 11 Apr 2016 07:00:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1903-guid.html</guid>
    <category>anleitung</category>
<category>apache</category>
<category>debian</category>
<category>jessie</category>
<category>ssl</category>

</item>
<item>
    <title>Der eigene Webserver mit SSL/TLS</title>
    <link>https://netz-rettung-recht.de/archives/1901-Der-eigene-Webserver-mit-SSLTLS.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1901-Der-eigene-Webserver-mit-SSLTLS.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1901</wfw:comment>

    <slash:comments>9</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1901</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Datenströme im Netz zu verschlüsseln ist wichtig, aber auch zunehmend Allgemeingut. Telnet würde sicherlich niemand mehr zum Zugriff auf einen entfernten Rechner nutzen; stattdessen nimmt man SSH. Auch bei anderen Protokollen ist die Übertragung von Passworten im Klartext schon lange out: es fing an mit APOP für den Zugriff über POP3 und CRAM-MD5 für SMTP-Auth, und schon etliche Jahre nutze ich nur noch POP3S/IMAPS/SMTPS, also eine komplette Verschlüsselung des gesamten Datenstroms. So hat auch das auf SSH basierende SCP/SFTP schon lange FTP ersetzt, und nachdem sich mittlerweile auch NNTPS und der verschlüsselte Zugriff auf IRC-Server verbreitet haben, bleiben nur noch wenige Protokolle &amp;#8220;offen&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Selbstverständlich sollte auch - zumindest - die Übertragung von Passworten via HTTP gesichert werden, was die Einrichtung von HTTPS erfordert. Je mehr sich webbasierte Dienste und Apps verbreiten, desto wichtiger ist das. Es ist allerdings - leider - nicht ganz so einfach.&lt;/p&gt;

&lt;h3 id=&quot;ssl-tls-zertifikate-und-deren-pr-fung&quot;&gt;SSL-/TLS-Zertifikate und deren Prüfung&lt;/h3&gt;

&lt;p&gt;Das liegt darin, dass Verschlüsselung allein zumindest im Grundsatz nicht genügt - wichtig ist auch Authentifizierung, also die Überprüfung, ob man auch mit der richtigen Gegenstelle spricht oder sich ein Dritter, der &amp;#8220;Man in the middle&amp;#8221;, dazwischengehängt hat. Zu einer mittels SSL/TLS (in Zukunft: SSL als Sammelbegriff für beides) gesicherten Verbindung gehört daher - eigentlich - auch immer die Überprüfung des Zertifikats der Gegenstelle. Dazu muss man entweder den Fingerprint des Zertifikats kennen und prüfen - PGP/GPG lässt grüßen -, oder man begnügt sich damit, dass eine Zertifizierungsstelle die Echtheit des Zertifikats bestätigt hat (und hofft auf deren Sorgfalt; eine Hoffnung, die die Praxis bereits vielfach enttäuscht hat).&lt;/p&gt;

&lt;p&gt;Will man selbst verschlüsselte Zugänge anbieten, genügt es für die meisten Dienste, ein selbst-signiertes Zertifikat zu erstellen und den Nutzern den Fingerprint mitzuteilen. In der Regel ist der Nutzerkreis selbstgehosteter Dienste nämlich überschaubar: der private Mailserver wird zum Versand und zum Mailabruf in der Regel nur selbst oder allenfalls von Familienmitgliedern und Freunden genutzt, die dem selbst-signierten Zertifikat dann vertrauen können. Nicht unüblich ist es auch, auf eine Zertifikatsprüfung zu verzichten und jedes präsentierte Zertifikat zu akzeptieren, also nur die Verschlüsselung zu nutzen und der Gegenstelle zu vertrauen. Das ist insofern nachvollziehbar, als es deutlich einfacher ist, (unverschlüsselten) Datenverkehr mitzulesen als sich als &amp;#8220;Man in the middle&amp;#8221; mit einem falschen Zertifikat in den verschlüsselten Datenstrom einzuklinken.&lt;/p&gt;

&lt;h4 id=&quot;https-im-speziellen&quot;&gt;HTTPS im Speziellen&lt;/h4&gt;

&lt;p&gt;Bei Webdiensten liegt der Fall hingegen etwas anders: zumeist erfolgt der Zugriff für die Allgemeinheit - der nicht zwingend einer Absicherung durch Verschlüsselung bedürfte - über dieselbe &amp;#8220;Domain&amp;#8221; (ich verwende den Begriff hier umgangssprachlich; richtiger wäre &amp;#8220;Hostname&amp;#8221;) wie die Administration. Ein Blog, bspw., das unter &lt;code&gt;http://meinblog.example/&lt;/code&gt; zugänglich ist, wird meist über &lt;code&gt;http://meinblog.example/admin/&lt;/code&gt; verwaltet, nicht aber über &lt;code&gt;http://admin.meinblog.example/&lt;/code&gt;. Ich muss also damit rechnen, dass auch die Allgemeinheit auf meine Webseiten über HTTPS zugreift, oder ich will das sogar erzwingen, damit ich nicht versehentlich Passwörter über eine ungeschützte Verbindung übertrage.&lt;/p&gt;

&lt;p&gt;Dann habe ich aber ein Problem: mein selbst-signiertes Zertifikat ist den Besuchern der Webseite natürlich unbekannt, und Browser generieren für diesen Anwendungsfall zunehmend auffälligere Warn- und Fehlermeldungen, die einen Zugriff auf die Seite entweder ganz unterbinden oder doch arg erschweren und den Durchschnittsnutzer abschrecken (was ja auch Sinn der Sache ist).&lt;/p&gt;

&lt;h4 id=&quot;-virtual-hosting-&quot;&gt;&lt;em&gt;Virtual Hosting&lt;/em&gt;&lt;/h4&gt;

&lt;p&gt;Zu diesem Problem der Fehlermeldungen bei selbst-signierten Zertifikaten kommt noch ein ein weiteres hinzu: es ist üblich, über einen Webserver (auf ein- und derselben IP-Adresse) eine Vielzahl von &amp;#8220;Domains&amp;#8221; (also getrennten Webseiten) anzubieten. Bei größeren Anbietern können das hunderte oder zigtausende Nutzer sein, die sich da auf einem Host tummeln, aber auch der private Nutzer hat vielleicht neben seiner Homepage unter &lt;code&gt;meine-domain.example&lt;/code&gt; auch noch ein Blog unter &lt;code&gt;blog.meine-domain.example&lt;/code&gt; oder will schlicht seine Webseiten sowohl unter &lt;code&gt;meine-domain.example&lt;/code&gt; als auch unter &lt;code&gt;www.meine-domain.example&lt;/code&gt; erreichbar machen. Das sind aber alles unterschiedliche Hostnamen, und da jedes SSL-Zertifikat angeben muss, für welchen Hostnamen es gültig ist, haben wir das nächste Problem: liefert der Webserver für &lt;code&gt;www.meine-domain.example&lt;/code&gt; das Zertifikat für &lt;code&gt;meine-domain.example&lt;/code&gt; aus, verfallen die Warnmeldungen im Browser nicht selten in eine noch schrillere Tonlage.&lt;/p&gt;

&lt;p&gt;Es ist leider auch nicht so einfach, für jede &amp;#8220;Domain&amp;#8221; ein eigenes Zertifikat zu präsentieren. Der Zugriff auf solche &lt;em&gt;virtual hosts&lt;/em&gt; erfolgt nämlich in der Weise, dass der Browser einen Header mitschickt, aus dem sich ergibt, auf welche &amp;#8220;Domain&amp;#8221; er zugreifen will. Für diesen Zugriff muss aber die verschlüsselte Verbindung schon stehen; andersherum weiss der Server beim Verbindungsaufbau noch nicht, welche &amp;#8220;Domain&amp;#8221; angefragt wird, und kann daher auch nicht das jeweils &amp;#8220;richtige&amp;#8221; Zertifikat ausliefern.&lt;/p&gt;

&lt;p&gt;Was also tun?&lt;/p&gt;

&lt;h3 id=&quot;l-sungswege&quot;&gt;Lösungswege&lt;/h3&gt;

&lt;p&gt;Über die Jahre habe ich verschiedene - allesamt mehr oder weniger unbefriedigende - Möglichkeiten getestet, um diesem Problem zu Leibe zu rücken.&lt;/p&gt;

&lt;h4 id=&quot;die-eigene-ca&quot;&gt;Die eigene CA&lt;/h4&gt;

&lt;p&gt;Angefangen habe ich vor gut einem Jahrzehnt mit einer eigenen Zertifizierungsstelle, die meine SSL-Zertifikate signiert. Dann reicht es nämlich, das Stammzertifikat dieser Zertifizierungsstelle dem Browser (und ggf. dem Mailprogramm) als gültig unterzuschieben, und alle anderen Zertifikate werden automatisch akzeptiert. Das erleichtert zumindest einmal mir selbst (und Freunden und Bekannten, die mir ausreichend trauen) den Umgang mit verschiedenen Servern und ggf. verschiedenen Hostnamen, behebt aber nicht das Problem, dass das Zertifikat immer nur für einen Hostnamen (eine &amp;#8220;Domain&amp;#8221;) gültig ist, und hilft auch den Webseitenbesuchern nicht.&lt;/p&gt;

&lt;p&gt;Ich habe mich daher in der Regel darauf beschränkt, HTTPS nur ergänzend anzubieten oder nur für solche Webseiten, die ausschließlich intern genutzt werden und sich nicht an die Allgemeinheit richten. Professionell geht aber fraglos anders.&lt;/p&gt;

&lt;h4 id=&quot;san&quot;&gt;SAN&lt;/h4&gt;

&lt;p&gt;Danach habe ich mich mit &lt;em&gt;Subject Alternate Names&lt;/em&gt;, kurz &lt;em&gt;SAN&lt;/em&gt;, vertraut gemacht. Es ist nämlich möglich, einem Zertifikat mitzugeben, dass es für mehr als einen Hostnamen gültig ist. Zum einen gibt es - nicht empfehlenswerte - sog. &amp;#8220;Wildcard-Zertifikate&amp;#8221;, die für alle Subdomains einer bestimmten Domain gültig sind, bspw. &lt;code&gt;*.domain.example&lt;/code&gt;. Zum anderen gibt es &lt;em&gt;SAN&lt;/em&gt; - zusätzliche Hostnamen, für die das jeweilige Zertifikat &lt;em&gt;auch&lt;/em&gt; gilt. Die kann man bei der Erstellung des Zertifikats mit angeben.&lt;/p&gt;

&lt;p&gt;Das funktioniert ganz gut, löst aber zum einen nicht das Problem der fehlenden allgemeinen Akzeptanz des Zertifikats und schafft zudem zwei neue Schwierigkeiten. Zum einen kann jeder Besucher durch Ansicht des Zertifikats feststellen, welche Webseiten auf dem Server sonst noch so gehostet werden (was nicht immer optimal ist), zum anderen braucht es für jede neue &amp;#8220;Domain&amp;#8221;, auf die auch per HTTPS zugegriffen werden soll, auch ein komplett neues Zertifikat.&lt;/p&gt;

&lt;h4 id=&quot;sni&quot;&gt;SNI&lt;/h4&gt;

&lt;p&gt;Dem strukturellen Problem, dass der Server &lt;em&gt;erst&lt;/em&gt; die verschlüsselte Verbindung aufbauen muss und danach erfährt, für welche &amp;#8220;Domain&amp;#8221; er das eigentlich tun soll, ist man mit &lt;em&gt;Server Name Indication&lt;/em&gt;, kurz &lt;em&gt;SNI&lt;/em&gt;, zu Leibe gerückt.  Das ist eine Erweiterung des TLS-Protokolls, die es dem Client erlaubt, beim Verbindungsaufbau bereits mitzuteilen, aus welcher &amp;#8220;Domain&amp;#8221; er später Webseiten abrufen will, so dass der Server ihm dann das richtige Zertifikat präsentieren kann. So kann auch der Webserver für jede &amp;#8220;Domain&amp;#8221; ein eigenes Zertifikat anbieten.&lt;/p&gt;

&lt;p&gt;Mittlerweile darf man davon ausgehen, dass &lt;em&gt;SNI&lt;/em&gt; so verbreitet ist, dass man es im praktischen Betrieb voraussetzen kann: Firefox unterstützt es seit Version 2.0, der Internet Explorer seit Version 7 und Windows Vista (nicht unter Windows XP), und auch &lt;code&gt;wget&lt;/code&gt; sollte das seit 2012 beherrschen.&lt;/p&gt;

&lt;h4 id=&quot;kommerzielle-zertifikate&quot;&gt;Kommerzielle Zertifikate&lt;/h4&gt;

&lt;p&gt;Dies wiederum ermöglicht es, auf kommerzielle SSL-Zertifikate zurückzugreifen. Deren Anbieter lassen sich nämlich ihre Dienste bei &amp;#8220;Wildcard-Zertifikaten&amp;#8221; oder solchen mit einer Vielzahl von Hostnamen (oder auch bei erweiterter Validierung der &amp;#8220;Domains&amp;#8221;, für die das Zertifikat gelten soll) geradezu fürstlich bezahlen; Zertifikate für nur ein oder zwei Namen (also bspw. &lt;code&gt;domain.example&lt;/code&gt; und &lt;code&gt;www.domain.example&lt;/code&gt;) sind hingegen erschwinglich oder gar kostenlos. &lt;em&gt;SNI&lt;/em&gt; macht es jetzt möglich, jeder &amp;#8220;Domain&amp;#8221; ihr eigenes günstiges Zertifikat zuzuweisen, bspw. von &lt;a href=&quot;https://www.startssl.com/&quot; title=&quot;Notice to all StartCom subscribers&quot;&gt;StartCom&lt;/a&gt;, einem Anbieter, der Zertifikate für maximal zwei &amp;#8220;Domains&amp;#8221; kostenlos abgibt (dann allerdings für den Widerruf eines kompromittierten Zertifikats Geld verlangt - nun ja).&lt;/p&gt;

&lt;p&gt;So kann man dann allmählich vernünftig mit SSL arbeiten.&lt;/p&gt;

&lt;h4 id=&quot;die-zukunft-letsencrypt&quot;&gt;Die Zukunft: letsencrypt&lt;/h4&gt;

&lt;p&gt;Neuerdings befindet sich zudem mit &lt;a href=&quot;https://letsencrypt.org/&quot; title=&quot; Let&amp;#39;s Encrypt&quot;&gt;Let&amp;#8217;s Encrypt&lt;/a&gt; ein Anbieter am Start, der sich kostenloses, freies und massentaugliches SSL/TLS auf die Fahnen geschrieben hat:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Let’s Encrypt is a new Certificate Authority:&lt;br /&gt;
  It’s free, automated, and open.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dazu werde ich später mehr berichten.&lt;/p&gt;

&lt;h3 id=&quot;ssl-zertifikate-und-apache&quot;&gt;SSL-Zertifikate und Apache&lt;/h3&gt;

&lt;p&gt;Nach der Theorie nun etwas Praxis: wie richte ich beim &lt;em&gt;Apache&lt;/em&gt;-Webserver einen &lt;em&gt;virtual hosts&lt;/em&gt; mit SSL ein?&lt;/p&gt;

&lt;p&gt;Im Prinzip ist das recht einfach; Debian liefert bspw. eine entsprechende Konfiguration schon mit. Ich setze im Folgenden voraus, dass sowohl passende SSL-Zertifikate (mit dem zugehörigen &lt;em&gt;private key&lt;/em&gt; in entschlüsselter Form, d.h. ohne Passwortschutz) vorhanden als auch &lt;em&gt;virtual hosts&lt;/em&gt; grundsätzlich eingerichtet sind. Die Zertifikate speichere ich im Verzeichnis &lt;code&gt;/etc/apache2/ssl&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Eine Basis-Konfiguration könnte dann - mit einem Zertifikat von &lt;em&gt;StartCom&lt;/em&gt; - bspw. so aussehen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:443&amp;gt;
    ServerName meine-domain.example
    ServerAlias www.meine-domain.example

    DocumentRoot /var/www/meine-domain.example

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/meine-domain.example.crt
    SSLCertificateKeyFile /etc/apache2/ssl/meine-domain.example.key
    SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Will man alle Zugriff von HTTP auf HTTPS umleiten, kann man bspw. folgendes ergänzen:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName meine-domain.example
    ServerAlias www.meine-domain.example

    Redirect / https://meine-domain.example/
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;disclaimer&quot;&gt;Disclaimer&lt;/h3&gt;

&lt;p&gt;SSL/TLS, der Umgang mit Zertifikaten und die Konfiguration des &lt;em&gt;Apache&lt;/em&gt; sind ein weites Feld, für das ich zudem kein Spezialist bin.&lt;/p&gt;

&lt;p&gt;Dieser Beitrag will einen kurzen, knappen und daher notwendigerweise unvollständigen Überblick zu diesem Thema geben und zur eigenen Beschäftigung damit anregen. Ich habe daher manches vereinfacht, anderes weggelassen, wieder anderes - absichtlich oder unabsichtlich - ungenau dargestellt.&lt;/p&gt;

&lt;p&gt;Dies ist &lt;strong&gt;kein&lt;/strong&gt; Tutorial, und die am Schluss genannten Beispiele sind &lt;strong&gt;nicht&lt;/strong&gt; zur 1:1-Übernahme via &lt;em&gt;copy &amp;amp; paste&lt;/em&gt; geeignet.&lt;/p&gt;

&lt;p&gt;Wenn sich Fehler eingeschlichen haben, bin ich über Kommentare dankbar - und auch Ergänzungen nehme ich natürlich gerne entgegen.&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/78d0b9aa0c014d7e82b6db4a8cdb322a&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Thu, 07 Apr 2016 05:50:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1901-guid.html</guid>
    <category>anleitung</category>
<category>apache</category>
<category>ssl</category>

</item>
<item>
    <title>Apache 2.x, php-cgi, mod_suphp und &quot;No input file specified!&quot;</title>
    <link>https://netz-rettung-recht.de/archives/1403-Apache-2.x,-php-cgi,-mod_suphp-und-No-input-file-specified!.html</link>
            <category>Bits'n'Bytes</category>
    
    <comments>https://netz-rettung-recht.de/archives/1403-Apache-2.x,-php-cgi,-mod_suphp-und-No-input-file-specified!.html#comments</comments>
    <wfw:comment>https://netz-rettung-recht.de/wfwcomment.php?cid=1403</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>https://netz-rettung-recht.de/rss.php?version=2.0&amp;type=comments&amp;cid=1403</wfw:commentRss>
    

    <author>nospam@example.com (Thomas Hochstein)</author>
    <content:encoded>
    &lt;p&gt;Im Zusammenhang mit dem Update einer Maschine auf Debian Lenny bin ich auf das seltsame Phänomen einer - offensichtlich von PHP erzeugten - Fehlermedlung gestoßen: der Aufruf einer bestimmten Webseite (respektive des PHP-Scripts, das diese erzeugen sollte) ergibt nur die Meldung &amp;quot;No input file specified!&amp;quot;. Google führt einen zu diversen Threads, die sich vor allem um die Konfiguration des richtigen Handlers für die Interpretation von PHP-Scripts und um hilflose Fragen von Benutzern, die eigentlich nur ein fertiges Paket installieren wollten und nun nicht mehr weiter wissen, drehen. Erst ein alter Blogeintrag in &lt;a href=&quot;http://blog.vodkamelone.de/archives/40-No-input-file-specified-reloaded-oder-komische-Fehlermeldungen-und-noch-komischere-Ursachen.html&quot; title=&quot;&amp;quot;No input file specified&amp;quot; reloaded oder komische Fehlermeldungen und noch komischere Ursachen  - ixs&#039; Vodkamelone&quot;&gt;ixs&amp;#8217; Vodkamelone&lt;/a&gt; (nein, das hat nichts mit einem Kamel Nr. Eins zu tun!) von 2005 half mir auf die Sprünge.&lt;/p&gt;

&lt;p&gt;Der Grund dieser Fehlermeldung ist offenbar ein ganz seltsames Zusammenspiel der Ausführung von PHP als &lt;em&gt;mod_suphp&lt;/em&gt;, d.h. der CGI-Version von PHP in der Weise, daß Scripts unter den Rechten des jeweiligen Benutzers ausgeführt werden, mit der Vergabe von Datei- und Verzeichnisrechten. Die oben genannten Fehlermeldung tritt demnach genau dann auf, wenn zwar der Webserver auf die Datei bzw. ihr Verzeichnis zugreifen, sie also &amp;quot;finden&amp;quot; kann, der Benutzer selbst aber nicht. Dann findet der Webserver - unter der UID &lt;em&gt;www-data&lt;/em&gt; - das Script, erkennt es, ruft den Handler auf, der als suid root installiert ist, sich Root-Rechte verschafft, damit auf die UID des Benutzers wechselt und dann mit diesen Rechten den PHP-Interpreter aufruft, um ihn das Script ausführen zu lassen. Dieser PHP-Prozess, der jetzt aber im Kontext des Benutzers läuft, kann dann selbst auf das entsprechende Verzeichnis nicht mehr zugreifen, das Script also auch nicht ausführen, und reagiert dann mit der obigen Fehlermeldung, denn er findet ja keine Datei, die er ausführen könnte.&lt;/p&gt;

&lt;p&gt;Vielleicht hilfts ja jemanden, wenn ich ixs&amp;#8217; Analyse her noch einmal wiedergebe und verlinke. &lt;img src=&quot;https://netz-rettung-recht.de/plugins/serendipity_event_emoticate/img/emoticons/smile.png&quot; alt=&quot;:-)&quot; class=&quot;emoticon&quot; /&gt;&lt;/p&gt;
&lt;img src=&quot;https://ssl-vg03.met.vgwort.de/na/d2c9ab8906a6430ab9a4e3666d35e65c&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;&gt; 
    </content:encoded>

    <pubDate>Fri, 17 Apr 2009 15:03:00 +0000</pubDate>
    <guid isPermaLink="false">https://netz-rettung-recht.de/archives/1403-guid.html</guid>
    <category>Apache</category>
<category>Debian</category>
<category>Lenny</category>
<category>PHP</category>

</item>

</channel>
</rss>
