Apache-HTTPS

Aus Wiki
Version vom 28. Februar 2009, 13:07 Uhr von Erich (Diskussion | Beiträge) (Die Seite wurde neu angelegt: == HTTPS-Support für Apache == Wenn die NSLU aus dem Internet erreichbar sein soll, und Passwörter oder sonstige sensible Daten übertragen werden sollen, empfiehlt ...)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

HTTPS-Support für Apache

Wenn die NSLU aus dem Internet erreichbar sein soll, und Passwörter oder sonstige sensible Daten übertragen werden sollen, empfiehlt es sich dies per SSL-Verschlüsselung zu erledigen, um ein evtl. Abhören der Informationen zu vermeiden. Der installierte Apache-Webserver enthält Support für HTTPS (SSL-Verschlüsselung). Dies ist besonders empfehlenswert für Webanwendungen wie → Webmail, da hier ansonsten Passwörter im Klartext durchs Internet gehen würden.

Die Aktivierung von HTTPS erfolgt in zwei Stufen:

  1. Erzeugung der Notwendigen SSL-Zertifikate
  2. Aktivieren von HTTPS in den Konfigfiles.

Voraussetzung:

OpennSSL ist installiert und die eigene Zertifizierungsstelle CA ist eingerichtet (→ siehe Anleitung)

Erzeugung der Zertifikate

SSL-Verschlüsselung basiert auf Zertifikaten. Diese Zertifikate müssen erst angelegt und mit Installationsspezifischen Daten gefüllt werden. Im folgenden werden sog. "Selfsigned Certificates" verwendet. D.h. Die erzeugten Zertifikate werden selbst Unterschrieben. Solche Zertifikate werden von den Webbrowsern "angemeckert", da sie gefälscht sein könnten. Vertrauenswürdige, von einer Zertifizierungsstelle wie Verisign authentifizierte Zertifikate sind allerdings kostenpflichtig (meist jährliche Gebühr). Für einen privaten Webserver ist dies allerdings absolut nicht nötig. Selbstsignierte Zertifikate erfüllen hier ihren Zweck.

Wichtige Anmerkungen

Wichtige Parameter für die SSL-Zertifikate:
  • C (country:2 Zeichen)
  • ST (State/Provinz)
  • L (Locality/Ort)
  • O (Organisation)
  • OU (Organisational Unit)
  • CN (Common Name)

Im folgenden müssen Schlüssel und Zertifikate für den eigenen Server erstellt werden. Zu beachten ist, dass der Common Name, Organisation und Organisational Unit jeweils unterschiedlich bei CA und Server gewählt werden (→ siehe auch Anmerkungen CA). Ansonsten kann es zu Problemen kommen, die bis dahin reichen, dass das erstellen der Zertifikate mit einem kryptischen Fehler abbricht.

Achtung: Beim Serverzertifikat muss unbedingt der Common Name (CN) des Zertifikates mit der Domain des Servers (→ i.A. Dynamic DNS-Adresse) bzw. genauer des Hostnamens bzw. des virtuellen Hosts (z.B. bei Apache) übereinstimmen. Andernfalls wird der Browser beim Besuch der Seite diese Diskrepanz jedesmal anmahnen.

Die Zertifikate haben - im Gegensatz zu den Keys - eine begrenzete Gültigkeitsdauer. Diese beträgt standardmäßig 365 Tage. D.h. Das Zertifikat wird nach einem Jahr ungültig und muß neu erstellt werden. Die Gültigkeit kann allerdings mit Hilfe des Parameters -days auf einen beliebigen Wert gesetzt werden.

Die Keys und Zertifikate haben ein Passwort zum Schutz vor fremden Zugriff. Für eine Serveranwendung ist dieser Schutz leider etwas hinderlich, da erst das Passwort eingegeben werden müßte, bevor der Apache-Server komplett starten würde. Dies wäre nach jedem Neustart von Apache und damit auch des Servers erforderlich. Deshalb wird hier der Passwortschutz von den Zertifiakten entfernt. D.h. wenn ein Fremder die Zertifikate in die Hände bekommen würde, könnte er evtl. die Kommunikation zwischen Server und Webbrowser belauschen.


Generierung SSL.Key

cd /opt/etc/ssl/key
openssl genrsa -des3 -out server.key 1024
Hinweis: Passwort key_pwd muss vergeben werden 

Entfernen des Passworts key_pwd:

mv server.key server.key.orig
openssl rsa -in server.key.orig -out server.key
chmod 600 server.key

Erzeugung Certificate Signing Request (CSR)

Wichtig: Bei der Frage nach dem Common Name (CN), den Domainnamen (→ z.B. Dynamic DNS - Domain) angeben. Ansonsten "meckert" der Browser später, dass angesurfte Webseite und Zertifikat nicht zusammen passen.
openssl req -new -key server.key -out server.csr

Folgende Eingaben sind notwendig (Bitte Organization Name und -Unit sowie Common Name abändern → Anmerkungen beachten):

Country Name: de
State or Province Name: de
Locality Name: .
Organization Name: private
Organizational Unit Name: server
Common Name: domain 
Email Address: .
A challenge password: .
An optional company name: .


Signierung des Server-Zertifikates

Folgendes File anlegen:

cd ../ca

Signieren (Abfragen mit y bestätigen):

openssl ca -config ca.config -out ../cert/server.crt -infiles ../key/server.csr

Verifizieren:

openssl verify -CAfile ca.crt ../cert/server.crt

Ausgabe sollte folgendermaßen aussehen:

../cert/server.crt: OK

Aufräumen

Temporäre Dateien entfernen:

rm -f ca.db.serial.old
rm -f ca.db.index.old


Konfiguration des Apache

Startscript

Um SSL verwenden zu können, muss das Apache Startscript leicht abgeändert werden:

vi /opt/etc/init.d/S80apache

Der vorhandene Startbefehl sollte auskommentiert werden (# voranstellen)

/opt/sbin/httpd -k restart

und folgender neuer Eintrag eingefügt werden:

/opt/sbin/httpd -DSSL -k restart

Apache Konfigurationsfile

Öffnen der Apache Konfigurationsdatei:

vi /opt/etc/apache2/httpd.conf

Folgenden Eintrag suchen:

#Include /opt/etc/apache2/extra/httpd-ssl.conf

Diesen folgendermaßen abändern (Kommentarzeichen # entfernen und Pfad anpassen):

Include /opt/etc/apache2/extra/httpd-ssl.conf

Appache SSL Konfigurationsfile

vi /opt/etc/apache2/extra/httpd-ssl.conf

Folgende Einträge auskommentieren (Kommentarzeichen # entfernen):

SSLRandomSeed startup file:/dev/urandom 512
SSLRandomSeed connect file:/dev/urandom 512

Folgende Einträge bearbeiten (Hinweis: der Eintrag ServerName und CN des Serzertifikates müssen exakt übereinstimmen (→ siehe Certificate Signing Request))

ServerName Domain:443 - z.B. schiele.homelinux.org:443
ServerAdmin email-Adresse des Administrators
SSLCertificateFile "/opt/etc/ssl/cert/server.crt"
SSLCertificateKeyFile "/opt/etc/ssl/key/server.key"

Funktionstest

Die Funktion des HTTPS-Protokolls kann auf zweierlei Art und Weise erfolgen:

  • Kommandozeile
  • Webbrowser. Dies setzt allerdings voraus, dass bereits eine Webseite installiert ist

Test via Kommandozeile auf der NSLU

openssl s_client -connect localhost:443 -state -debug

Dieser Befehl sollte ohne Fehler ablaufen und eine Menge Informationen bgl. der Zertifiakte ausspucken.

Test via Webbrowser

Webbrowswer öffnen und https://IP_der_NSLU/phpinfo.php eingeben. Der Webbrowser gibt eine Warnung aus, dass das Zertifikat nicht vertrauenswürdig ist (da es selbst signiert wurde, anstatt von einer bekannten Certification Authority). Warnung bestätigen (entweder Zertifikat permanent aktivieren, oder nur für aktuelle Sitzung, je nach Geschmack). Eine weitere Warnung wird erscheinen, wenn der Servername in der Konfiguration die (Dynamic DNS) Domain enthält, aber im Webbrowser die interne IP-Adresse eingeben wurde. D.h. angesurfte Webadresse stimmt nicht mit dem Zertifikat überein. Warnung ebenfalls bestätigen.

Nun sollte die Webseite erscheinen.