Wenn man einen Webserver unter Mac OS X betreibt, und ausserdem möchte, dass die gesamte Kommunikation mit diesem verschlüsselt abläuft, wird man sich früher oder später mit dem mod_ssl
-Modul des Apache Webservers befassen. Dieses fantastische Stück Software sorgt beispielsweise dafür, dass nicht jeder der im gleichen WLAN sitzt oder sonst irgendwie den Datenverkehr mitschneiden kann, auch die Usernamen, Passwörter oder sonstige interessante Daten frei Haus erhält. In dem oben stehenden Bild ist mein Login über HTTP schön zu sehen1.
Wie man das ganze unter OS X recht flugs, allerdings auch nicht so richtig geeignet für ein echtes Produktivsystem, hin bekommt wird hier in fünf Schritten beschrieben.
- Erstellung einer eigenen Certification Authority (CA)
- Erstellung eines Private Key für den Web Server
- Erstellung eines Certificate Request für den gerade erstellten Private Key des Webservers
- Unterschreiben des Certificate Request mit dem Key der CA
- Anpassen der Apache-Configs
Weiter geht es nach dem Klick…
Erstellung einer eigenen Certification Authority
Man erstellt auf der Konsole in seinem “Dokumente” Verzeichnis einen neuen Ordner und wechselt hinein. So sind die Zertifikate hübsch ordentlich aufgehoben.
1 2 3 |
|
In diesem Verzeichnis wird dann mit dem CA.pl Script eine neue Certification Authority erstellt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
Die folgenden Fragen sollte man so beantworten, dass die Herkunft der CA für Besucher des verschlüsselten Servers erkennbar ist. Bei mir etwa so:
1 2 3 4 5 6 7 |
|
Jetzt existiert in dem certs
Verzeichnis eine neue CA in einem eigenen Ordner:
1 2 3 4 5 6 7 8 9 10 |
|
Erstellung eines Private Key für den Web Server
Mit dem folgenden openssl Befehl wird nun ein private key für den Webserver erstellt.
1
|
|
Bei der darauf folgenden Passwortabfrage, sollte man eines wählen, das von dem Passwort der CA abweicht.
1 2 3 4 5 6 |
|
Aus praktischen Gründen wird jetzt noch ein Schlüssel ohne die Passphrase erstellt:
1 2 3 |
|
Der Schlüssel mit Passphrase ist jetzt webserver.key
und der ohne ist webserver.nopass.key
.
Diese Übung ist nötig, weil ein Webserver der mit einem Zertifikat mit Passphrase verschlüsselt, diese Passphrase bei jedem Neustart des Servers erwartet. Das würde für einen normalen Mac bedeuten, dass der Start des Systems hängt, da der Apache auf die Eingabe der Passphrase wartet. Man kann den Mac zwar im Verbose-Mode booten und die Eingabe vornehmen, komfortabel ist das aber nicht.
Erstellung eines Certificate Request für den gerade erstellten Private Key des Webservers
Für den gerade erstellten Schlüssel wird nun eine Zertifikatsanforderung2 erstellt. Diese wird dann im nächsten Schritt mit dem Schlüssel der CA unterschrieben.
1
|
|
Bei der folgenden Abfrage ist es wichtig darauf zu achten, dass bei “Common Name (eg, YOUR name)” der wirkliche Name des Servers eingetragen wird, unter dem er auch später erreichbar sein soll. Bei einem Test auf dem lokalen System wäre das z.B. “localhost” oder “127.0.0.1”. Bei einem Test in einem lokalen Netz ohne Namensauflösung z.B. “192.168.1.6” und bei einem System das unter einem DNS-Namen erreichbar ist eben dieser. Wenn hier nicht der exakt passende Name des Servers steht wird es später zu Zertifikatsfehlern kommen, YMMV.
Die Extra Attribute “challenge password” und “company name” können leer gelassen werden.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
Damit wurde die Zertifikatsanforderung newreq.pem
erstellt.
Unterschreiben des Certificate Request mit dem Key der CA
Mit dem folgenden Befehl wird das Unterschreiben der Zertifikatsanforderung angestossen:
1
|
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
|
Damit ist das Zertifikat newcert.pem
erstellt. Jetzt ist es eine gute Idee ein weiteres Verzeichnis mit dem Namen des Servers zu erstellen und alle für ihn erstellten Dateien hinein zu bewegen.
1 2 |
|
Das ganze schaut dann etwa so aus:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
Anpassen der Apache-Configs
Als letztes wird der Apache-Server für verschlüsselte Verbindungen konfiguriert. Dazu wird zunächst in der Datei /etc/apache2/httpd.conf
die Datei httpd-ssl.conf
inkludiert in der dann die restlichen Einträge vorgenommen werden. Die passende Zeile ist bereits vorhanden3 werden.
Das Ergebnis sollte so aussehen:
1 2 |
|
In der Datei /etc/apache2/extra/httpd-ssl.conf
müssen nun die folgenden Variablen auf die vorhin erstellten Dateien inklusive dem vollen Pfad zeigen:
1 2 3 4 |
|
Man kann hier auch das DocumentRoot
auf einen anderen Pfad als die nicht verschlüsselten Inhalte setzen wenn man das möchte. Das kann dann z.B. so ausschauen:
1
|
|
Jetzt kann man den Apache mit sudo apachectl graceful
neu starten und sollte dann unter https://localhost4 eine verschlüsselte HTTP-Verbindung herstellen können.
Usernamen und Passwörter die oben noch im Klartext zu lesen waren sehen für potentielle Mitlauscher nun nur noch so aus:
Und das ist eine gute Sache.
Wenn man ein solches System produktiv einsetzen möchte, sollte man zu allermindestens die CA auf einen anderen Computer auslagern. Noch besser5 wäre es, sich sein Zertifikat von einer richtigen CA unterschreiben zu lassen. Dann müsste man auch nicht mehr mit der unvermeidlichen Fehlermeldung leben, dass das Zertifikat von einer unbekannten CA ausgestellt wurde…
Natürlich kann man für seinen Browser eine passende Ausnahme konfigurieren, für einen Produktivserver ist so etwas aber nicht hinnehmbar.
(via: Apple & macosxhints.com)