[[Vorlage(Getestet, focal)]]
{{{#!vorlage Wissen
[:Terminal: Ein Terminal öffnen] 
[:Editor: Einen Editor öffnen]
}}}
[[Inhaltsverzeichnis(-)]]

[[Bild(Wiki/Icons/security.png, 48, align=left)]]

= Einleitung =

Diese Anleitung beschreibt die Aktivierung der [wikipedia:Transport_Layer_Security: SSL-Verschlüsselung] für den Webserver [:Apache:Apache2].

Der Artikel zur Erzeugung eines dazu nötigen SSL-Zertifikates samt zugehörigem privaten Schlüssel findet sich ab sofort hier: [:TLS-Zertifikate:] . 

= Installation =
Das SSL-Modul des Apache wird zusammen mit der Installation von [:Apache_2.4/#Installation:] installiert. 

= Benutzung =

== Modul aktivieren ==
Zur Verwendung muss das Modul noch einmalig aktiviert werden. Das geschieht mit den Kommandos

{{{#!vorlage Befehl
sudo a2enmod ssl
sudo service apache2 restart
}}}

== Konfiguration ==
Um TLS/SSL verwenden zu können, muss der Apache auf TCP-Port `443` lauschen. Dies wird in der Datei '''/etc/apache2/ports.conf''' definiert. Wichtig ist dabei der Abschnitt

{{{
<IfModule ssl_module>
    Listen 443
</IfModule>
}}}

In älteren Ubuntu- bzw. Apache-Versionen ist dieser Abschnitt u.U. auskommentiert und damit abgeschaltet. Zur Aktivierung müssen lediglich die Kommentarzeichen (vorangestellte '''#''') entfernt werden.

Nach dieser Änderung muss die Konfiguration des Apache neu eingelesen werden:

{{{#!vorlage Befehl
sudo service apache2 reload
}}}

== SSL-Webseite konfigurieren ==
Abschließend muss nur noch ein [:Apache/Virtual_Hosts:Virtual Host] für TLS/SSL eingerichtet werden. Im folgenden Beispiel wird davon ausgegangen, dass ein SSL-Zertifikat unter '''/etc/ssl/certs/apache.crt''' und ein zugehöriger Schlüssel unter '''/etc/ssl/private/apache.key''' abgelegt wurde. 

Für die Konfiguration wird die Datei '''/etc/apache2/sites-available/ssl.conf''' mit folgendem Inhalt erstellt:

{{{
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile /etc/ssl/certs/apache.crt
    SSLCertificateKeyFile /etc/ssl/private/apache.key
    
    # Pfad zu den Webinhalten
    DocumentRoot /var/www/html/
</VirtualHost>
}}}

Dieser VirtualHost wird nun mit 

{{{#!vorlage Befehl
sudo a2ensite ssl.conf
}}}

aktiviert. Anschließend lässt man den Apache die Konfiguration und lädt bei Erfolg die Konfiguration in den laufenden Apache:
{{{#!vorlage Befehl
sudo apache2ctl configtest && sudo service apache2 reload
}}}

= Ausbau =

== SSL erzwingen ==
Oftmals wird gewünscht, dass Seiten nur über `https://` erreicht werden können. Dies kann in vielen Fällen einfach mit der Apache [https://wiki.apache.org/httpd/RedirectSSL Redirect-Directive] {en} oder mit dem Apache-Modul [:Apache/mod_rewrite/#Alles-auf-HTTPS-umleiten:mod_rewrite] erreicht werden.

{{{
<VirtualHost *:80>
    Redirect permanent / https://SERVER_NAME/
</VirtualHost>
}}}

== HSTS ==

Um die Sicherheit noch weiter zu erhöhen, kann das [wikipedia:Hypertext_Transfer_Protocol_Secure#HSTS: HTTP Strict Transport Security (HSTS)]-Verfahren eingesetzt werden. Dadurch werden z. B. [wikipedia:Man-in-the-middle-Angriff: Man-in-the-middle-Angriffe] erschwert. Um diese Funktion nutzen zu können, muss zuerst das Modul `mod_headers` aktiviert werden: 

{{{#!vorlage Befehl
sudo a2enmod headers
}}}

Anschließend muss in der vHost-Konfigurationsdatei (Port 443) folgende Zeile ergänzt werden:

{{{
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains;"
}}}

Mit der `max-age`-Angabe wird dem Browser mitgeteilt, dass die entsprechende Website in den nächsten 365 Tagen (= 31536000 Sekunden) nur noch via HTTPS aufgerufen werden soll. Um die Änderungen wirksam zu machen, wird die Konfiguration neu geladen:

{{{#!vorlage Befehl
sudo service apache2 reload
}}}

= Problembehebung =

== Port 443 schon von Apache selbst belegt ==
Erscheint beim Starten des Servers die Fehlermeldung  

> (98)Address already in use: make_sock: could not bind to address 0.0.0.0:443
>
> no listening sockets available, shutting down

so sollten die Einträge in '''/etc/apache2/ports.conf''' überprüft werden. Dort darf der Eintrag 

{{{#!code apache
Listen 443
}}}
nur einmal vorhanden sein. Auch in anderen Dateien der Apache-Konfiguration darf diese Direktive nicht nochmal vorkommen!

== SSL-Fehlermeldung beim Verbindungsaufbau ==
Erscheint beim Seitenaufruf im Browser die Fehlermeldung

> ssl_error_rx_record_too_long

liegt das meist an fehlerhaft konfigurierten vHosts. Es sollten zwei VirtualHost-Einträge innerhalb der Dateien in '''/etc/apache2/sites-available/''' vorhanden sein:

{{{#!code apache
VirtualHost *:80
VirtualHost *:443
}}}

= Links =
== intern ==
 * [:SSL:] Erlangung eines SSL-Zertifikates

== extern ==
 * [http://httpd.apache.org/docs/2.4/ssl/ mod_ssl] {en} - Dokumentation bei apache.org
 * [github:nabla-c0d3/sslyze:SSLyze] {en} - umfangreiche Testsuite für SSL-Server
 * [https://www.ssllabs.com/ssltest/ SSL Server Test] {en} - Online-Prüfung, Qualys SSL Labs
 * [wikipedia:SSL-Verschlüsselung: SSL-Verschlüsselung]

# tag: Internet, Netzwerk, Server, Sicherheit, Verschlüsselung, Apache, SSL