mod_ssl
Referenz der mod_ssl-Direktiven
Bei besonders sensiblen Web-Transaktionen wie der Übertragung von Bezahlinformationen im E-Commerce ist nicht nur die persönliche Benutzeranmeldung wünschenswert. Darüber hinaus sollten die Inhalte selbst verschlüsselt übertragen werden, damit Angreifer, denen es gelingt, sie von einem Router abzufangen, sie nicht lesen können.
Die passende Lösung für gesicherte Verbindungen heißt SSL (Secure Sockets Layer). Inzwischen gibt es einen Nachfolger namens TLS (Transport Layer Security). Wenn im Folgenden von SSL die Rede ist, dann ist immer auch TLS gemeint.
SSL ist nicht auf den Einsatz mit einem Webserver beschränkt, sondern kann im Grunde jede beliebige TCP-Verbindung absichern. Die grundlegende Funktionalität wird nämlich von einer unabhängigen Bibliothek namens OpenSSL bereitgestellt, die sich sowohl in eigenen als auch in bestehenden Programmen einsetzen lässt. Übrigens ist OpenSSL nicht die einzige Implementierung einer Verschlüsselungsbibliothek – die Tatsache, dass sie frei verfügbar ist, macht sie aber zur ersten Wahl. Sie besteht aus Funktionen, Programmierschnittstellen und Kommandozeilentools.
In Apache wird die SSL-Unterstützung durch das Modul mod_ssl bereitgestellt; in Version 2 gehört es sogar zum Lieferumfang – zumindest unter UNIX; unter Windows ist SSL-Unterstützung nicht ganz so einfach zu haben. Die erste SSL-Implementierung in Apache war die im Core modifizierte Variante Apache-SSL von Ben Laurie. Der entsprechende Code wurde dann von Ralf S. Engelschall, dem Autor von mod_rewrite, in ein unabhängiges Modul übernommen und seitdem weiterentwickelt.
Grundbegriffe der Kryptografie
In dieser Einführung werden zahlreiche Begriffe aus dem Bereich der Kryptografie verwendet. Zwar geht es hier vornehmlich um die praktische Konfiguration von mod_ssl, aber mit einigen Grundlagen sollten Sie vertraut sein. Die wichtigsten von ihnen werden hier kurz eingeführt:
- Symmetrische Verschlüsselung. Bei dieser klassischen Form der Verschlüsselung wird zur Verschlüsselung und zur Entschlüsselung derselbe Schlüssel verwendet. Damit dies sicher ist, muss der Schlüssel selbst vor Außenstehenden verborgen werden. Zur Absicherung anonymer Internetverbindungen ist dieses Verfahren deshalb nicht geeignet.
- Asymmetrische Verschlüsselung. Diese Form der Kryptografie wird auch als Public-Key-Verfahren bezeichnet. Für die Verschlüsselung wird ein anderer Schlüssel verwendet als zur Entschlüsselung. Einer der beiden Schlüssel ist öffentlich (Public Key), der andere geheim (Private Key). Jeder, der an einem solchen Verschlüsselungsverfahren teilnehmen möchte, kann seinen öffentlichen Schlüssel verteilen. Wer diesem Teilnehmer eine Nachricht senden möchte, kann sie mit dessen öffentlichem Schlüssel verschlüsseln. Der andere Teilnehmer kann sie daraufhin mit seinem privaten Schlüssel dechiffrieren. Genau dieses Verfahren liegt Internet-Kryptografielösungen wie SSL oder PGP zugrunde.
- Einwegverschlüsselung. Bei dieser besonderen Form der Verschlüsselung ist die Dechiffrierung nicht vorgesehen und (sofern der Algorithmus korrekt arbeitet) auch nicht möglich. Einwegverschlüsselung wird beispielsweise für Passwörter verwendet: Anstatt das Passwort für den Vergleich mit der Benutzereingabe zu entschlüsseln (was ein erhebliches Sicherheitsrisiko wäre), wird die Eingabe nach demselben Verfahren chiffriert wie das verschlüsselt gespeicherte Passwort.
- Digitale Signatur. Eine Signatur wird benutzt, um die Identität eines Absenders zu gewährleisten. Damit dies wirklich sichergestellt ist, muss die Signatur von einer vertrauenswürdigen Zertifizierungsstelle beglaubigt werden. Anschließend kann der Anbieter Inhalte mit seinem privaten Schlüssel signieren; mit seinem öffentlichen Schlüssel können Empfänger seine Identität überprüfen.
- Message-Digest. Ein Message-Digest-Algorithmus (auch Message Authentication Code oder kurz MAC genannt) berechnet aus einem recht langen Inhalt eine möglichst kurze Zeichenfolge, die die Eindeutigkeit des ursprünglichen Inhaltes gewährleistet. Eine Änderung des Inhaltes sollte zuverlässig auch den Digest-Wert verändern. Dies gewährleistet die Integrität von Inhalten wie E-Mails, Webseiten oder Downloads.
SSL-Grundlagen
Das SSL-Protokoll wurde ursprünglich von Netscape entwickelt. Die Version 1.0 wurde kaum in der Praxis eingesetzt. Bei Version 2.0 war das anders, weil sie 1995 in den Netscape Navigator 1.0 eingebaut wurde. Dies hat zu einer recht schnellen Verbreitung von SSL geführt – gesicherte Verbindungen erfordern nämlich, dass sich Server und Client auf dasselbe Protokoll einigen. Inzwischen beherrschen so gut wie alle wichtigen Browser sowohl SSL 1 und 2 als auch TLS.
Im Browser ist die verschlüsselte Verbindung vor allem daran erkennbar, dass die URLs mit dem Schema https: (s für "secure") statt mit http: beginnen. Der Standard-TCP-Port für diese Verbindungen ist nicht der HTTP-Port 80, sondern 443.
mod_ssl erledigt in Zusammenarbeit mit dem Browser die folgenden Aufgaben:
- Identitätsgarantie. SSL verwendet digitale Zertifikate, die bestätigen, dass der Anbieter einer Information tatsächlich er selbst ist. Das Zertifikat an sich wäre eigentlich nichts wert – weiter unten wird gezeigt, wie leicht Sie selbst eines erstellen können. Vielmehr geht es darum, dass ein vernünftiges Zertifikat von einer vertrauenswürdigen Zertifizierungsstelle mit einer digitalen Signatur versehen wird. Solche Zertifizierungsstellen (Certification Authorities) signieren Zertifikate gegen eine Gebühr und überprüfen dabei genau die Identität des Antragstellers. Die Daten der wichtigsten Zertifizierungsstellen sind bereits in viele Browser eingebaut.
- Integritätsprüfung. mod_ssl verwendet Message-Digest-Algorithmen wie MD5, um sicherzustellen, dass der Client genau die Daten erhält, die der Server geliefert hat. Verschlüsselung allein schützt nämlich unter Umständen nicht davor, dass ein Angreifer die Daten auf dem Weg austauscht.
- Verschlüsselung. Dies ist natürlich die bekannteste Funktion von SSL. Client und Server vereinbaren einen Session-Key, mit dem die Daten verschlüsselt werden. Wie der Name schon sagt, ist dieser Schlüssel nur für die aktuelle Sitzung gültig. Ein Cracker könnte also zu einem späteren Zeitpunkt nichts mehr damit anfangen.
Der Aufbau der gesicherten Verbindung erfolgt nach folgendem Schema:
- Der Client fordert eine URL mit dem Schema https: an.
- Der Server sendet dem Client sein Zertifikat und seinen öffentlichen Schlüssel.
- Der Client überprüft das Zertifikat. Wenn es nicht von einer bekannten vertrauenswürdigen ZertfZertifizierungsstelle signiert wurde, warnt der Browser den Benutzer und fragt, ob er mit der Anfrage fortfahren soll. Ähnliches geschieht, wenn das Zertifikat abgelaufen ist oder zurückgezogen wurde. Abbildung 1 zeigt, wie eine solche Meldung im Internet Explorer aussieht.
- Nachdem der Client (oder der Benutzer) das Zertifikat anerkannt hat, sendet der Server den Session-Key, der zur Verschlüsselung des gesamten Datenverkehrs während der Sitzung verwendet wird.

Abbildung 1: Ausgabe des Microsoft Internet Explorers, wenn eine SSL-Verbindung angefordert wurde, die ein ungültiges (in diesem Fall selbst signiertes) Zertifikat liefert
SSL einrichten
Bevor Sie mod_ssl einsetzen können, müssen Sie OpenSSL einrichten und ein Zertifikat erzeugen. Auf UNIX-Systemen ist die Wahrscheinlichkeit groß, dass OpenSSL-Bibliothek und -Tools bereits installiert sind. Falls nicht, werden sie wahrscheinlich in einer speziellen Variante für Ihre Distribution angeboten. Unter www.openssl.org finden Sie alternativ die Quellcode-Pakete zum Selbstkompilieren. In jedem Fall ist OpenSSL unter UNIX Standardsoftware, und die Beschaffung sowie die Installation bereiten keine Probleme. Deshalb braucht hier auch nicht näher darauf eingegangen zu werden.
OpenSSL unter Windows installieren
Unter Windows ist die Installation von OpenSSL ein wenig komplizierter. Die Apache-Binärdistributionen für Windows enthalten keine SSL-Unterstützung. Die Beschaffung der OpenSSL-Installationspakete erfordert ebenfalls eine längere Suchmaschinensitzung, aber unten auf dieser Seite finden Sie passende Download-Links.
Doppelklicken Sie zur Installation auf die Datei Win32OpenSSL-v0.9.7d.exe. Nun müssen Sie sich nacheinander mit Next durch folgende Screens klicken:
- Kurze Info, dass OpenSSL installiert wird,
- Zustimmung zum Lizenzvertrag. Dieser weist Sie unter anderem darauf hin, dass die Verwendung starker Kryptografie in einigen Ländern gesetzlichen Einschränkungen unterworfen ist und dass ihre Verwendung in anderen Ländern durch US-Exportbeschränkungen behindert wird,
- Auswahl des Installationsverzeichnisses (zum Beispiel C:\OpenSSL),
- Name des Eintrags im Startmenü (standardmäßig OpenSSL),
- Zusammenfassung der Installationsoptionen. Wenn alles in Ordnung ist, können Sie Install anklicken.
Es gibt neben diesem Installer übrigens auch einfache ZIP-Archive mit OpenSSL für Windows. Diese können Sie einfach in ein Verzeichnis wie C:\OpenSSL entpacken, und sie sind dann ebenfalls einsatzbereit – mit einer Ausnahme: Sie müssen die mitgelieferten Dateien ssleay32.dll, libeay32.dll und libssl32.dll manuell in Ihr %SystemRoot%\System32-Verzeichnis kopieren.
Im bin-Verzeichnis Ihrer OpenSSL-Installation benötigen Sie zu guter Letzt noch eine Datei namens openssl.cnf, die unter anderem Einstellungen für die Zertifikatsanforderung enthält. Bei der Binärinstallation wird sie automatisch installiert und funktioniert ohne Änderungen. Beachten Sie, dass die Datei auf manchen Windows-Rechnern aufgrund der Dateiendung .cnf als Verknüpfungs-Icon und ohne Endung dargestellt wird.
Ein Zertifikat erzeugen
Nachdem OpenSSL zur Verfügung steht, können Sie ein (Test-)Zertifikat erstellen. Dieser Schritt funktioniert unter UNIX und Windows identisch. Als Erstes müssen Sie in das Verzeichnis bin Ihrer OpenSSL-Installation wechseln. Alternativ können Sie dieses Verzeichnis auch zu Ihrem PATH hinzufügen und die Umgebungsvariable OPENSSL_CONF auf den Pfad Ihrer openssl.cnf-Datei setzen.
Geben Sie zum Erstellen des Zertifikats folgenden Befehl ein:
# openssl req -config openssl.cnf -new -out mynet.csr
Statt mynet.csr sollten Sie natürlich einen Dateinamen wählen, der Ihrem eigenen Domain-Namen entspricht. Nun müssen Sie eine Reihe von Fragen beantworten – die fett gedruckten Angaben in der nachfolgenden Beispielausgabe müssen Sie durch die für Sie zutreffenden Werte ersetzen. Sehr wichtig ist, dass Sie bei der Frage Common Name (eg, YOUR name) den vollständigen Hostnamen Ihrer SSL-Website (zum Beispiel www.mynet.de) angeben, weil Browser das Zertifikat sonst nicht akzeptieren und eine Meldung wie in Abbildung 1 anzeigen.
Loading 'screen' into random state - done
Generating a 1024 bit RSA private key
...................++++++
.....................++++++
writing new private key to 'privkey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be
incorporated into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:de
State or Province Name (full name) [Some-State]:NRW
Locality Name (eg, city) []:Koeln
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyNet GmbH
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:www.mynet.de
Email Address []:info@mynet.de
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Als PEM-Passphrase für den privaten Schlüssel müssen Sie zweimal denselben Text eingeben (der hier nicht angezeigt wird). "Passphrase" bedeutet nicht, dass es ein sinnvoller Satz sein sollte, sondern weist nur darauf hin, dass der Text aus Sicherheitsgründen erheblich länger sein sollte als ein normales Passwort. Möglicherweise kennen Sie das Verfahren von PGP – dort müssen Sie sich die Passphrase gut einprägen, weil sie zur Entschlüsselung eingegeben werden muss. Im vorliegenden Fall wird sie aber eigentlich nur noch einmal benötigt – nämlich zur Erzeugung des RSA-Schlüssels für das Zertifikat. Geben Sie dazu Folgendes ein (mynet können Sie wieder durch Ihren selbst gewählten Namen ersetzen):
# openssl rsa -in privkey.pem -out mynet.key
Enter pass phrase for privkey.pem:
writing RSA key
Optional können Sie nun noch die Datei .rnd löschen, da sie nicht mehr benötigt wird und potentiellen Angreifern nützlich sein könnte:
# rm .rnd
Unter Windows müssen Sie natürlich del statt rm verwenden – es sei denn, bei Ihnen ist CygWin installiert.
Wenn Sie alle Schritte bis zu diesem Punkt ausgeführt haben, besitzen Sie noch kein fertiges Zertifikat, sondern eine Anforderung zur Signatur des Zertifikats. Wenn Sie das Zertifikat für einen öffentlichen Webserver einsetzen möchten, müssen Sie diese Anforderung nun an eine vertrauenswürdige Zertifizierungsstelle wie VeriSign oder Thawte senden und von ihr signieren lassen.

Abbildung 2: Darstellung eines zweigliedrigen Zertifizierungspfades im Internet Explorer
Ein Browser, der das Zertifikat überprüft, geht dabei nach einem so genannten Zertifizierungspfad (Certification Chain) vor: Er überprüft zunächst den Aussteller der gelieferten Zertifikats. Wenn auch dieser unbekannt ist, wird wiederum der Aussteller von dessen Zertifikat gesucht und so weiter, bis eine vertrauenswürdige Zertifizierungsstelle gefunden wird (ober bis keine weiteren Aussteller mehr verfügbar sind). Abbildung 2 zeigt, wie ein solcher Zertifizierungspfad im Microsoft Internet Explorer dargestellt wird.
Zu Testzwecken oder für einen geschlossenen Nutzerkreis – zum Beispiel im Intranet – können Sie das Zertifikat aber auch einfach selbst signieren. Das funktioniert folgendermaßen:
# openssl x509 -in mynet.csr -out mynet.cert -req -signkey mynet.key -days 365
Loading 'screen' into random state - done
Signature ok
subject=/C=de/ST=NRW/L=Koeln/O=MyNet GmbH/CN=www.mynet.de/emailAddress=info@mynet.de
Getting Private key
Abbildung 3 zeigt, wie das Zertifikat im Internet Explorer 6.0 aussieht. Sie können es sich über einen Doppelklick auf das kleine Vorhängeschloss (Symbol für die verschlüsselte Verbindung) in der Statuszeile anzeigen lassen.

Abbildung 3: Ansicht eines Zertifikats im Microsoft Internet Explorer
Wenn Sie möchten, dass Benutzer mit dem Internet Explorer 4.x auf Ihre gesicherte Site zugreifen können, müssen Sie den Schlüssel nun DER-codieren. Dies geschieht mit folgendem Befehl:
# openssl x509 -in mynet.cert -out mynet.der.crt -outform DER
Damit haben Sie die beiden Dateien mynet.cert (das Zertifikat) und mynet.key (den öffentlichen Schlüssel) erstellt, beziehungsweise entsprechende Dateien mit Ihrem eigennen Domain-Namen. Diese müssen mit Hilfe der Apache-Konfigurationsdirektiven SSLCertificateFile (Zertifikat) beziehungsweise SSLCACertificateKeyFile (Schlüssel) eingebunden werden.
mod_ssl-Grundkonfiguration
In diesem Abschnitt wird eine vollständige Beispielkonfiguration vorgestellt, die es Ihnen ermöglicht, auf ein und demselben Server eine ungesicherte Website auf Port 80 und eine verschlüsselte auf Port 443 zu betreiben.
Zunächst einmal müssen Sie natürlich das Modul mod_ssl laden. Auf UNIX-Systemen wird es mitgeliefert; die fertig kompilierte Variante für Windows können Sie dagegen weiter unten herunterladen und direkt in Ihr modules-Verzeichnis kopieren.
Falls Sie mod_ssl nicht statisch einkompiliert haben, wird die DSO-Variante nun mit der üblichen LoadModule-Direktive eingebunden:
LoadModule ssl_module modules/mod_ssl.so
Das Modul erwartet, dass Ihr conf-Verzeichnis eine zusätzliche Konfigurationsdatei namens ssl.conf enthält. Sämtliche Direktiven in der Standardversion dieser Datei befinden sich innerhalb des Containers <IfDefine SSL> ... </IfDefine>. Die Einstellungen werden also nur aktiviert, wenn Sie Apache mit folgender Kommandozeilenoption starten:
# httpd -DSSL
Wenn Sie möchten, können Sie die <IfDefine>-Tags aber auch entfernen oder die entsprechenden Direktiven sogar in Ihre httpd.conf übernehmen, damit sie bei jedem Apache-Start automatisch aktiviert werden. ssl.conf muss aber aus formalen Gründen bestehen bleiben.
Das erste, was Sie hinzufügen müssen, ist eine zusätzliche Listen-Direktive – in aller Regel für den HTTPS-Standard-Port 443:
Listen 443
Als Nächstes wird der folgende Mindestsatz an Direktiven zur allgemeinen SSL-Grundkonfiguration benötigt:
SSLMutex default
SSLRandomSeed startup builtin
SSLSessionCache none
Die einzelnen Direktiven werden nach und nach im Newsletter erläutert; grob gesprochen handelt es sich um die Definition eines Sperrverfahrens zur Serialisierung be-stimmter SSL-Prozesse (SSLMutex), die Methode zur Bestimmung eines Random-Seeds (Startzahl für die Berechnung von Zufallszahlen, SSLRandomSeed) sowie um die Einstellung eines Caches für SSL-Sessions (SSLSessionCache).
Nun wird für Port 443 ein virtueller Host definiert; innerhalb des <VirtualHost>-Containers befinden sich die Direktiven für die SSL-Funktionalität. Der entsprechende Abschnitt sieht beispielsweise so aus:
<VirtualHost *:443>
SSLEngine On
SSLCertificateFile conf/ssl/mynet.cert
SSLCertificateKeyFile conf/ssl/mynet.key
DocumentRoot /usr/local/apache2/sichere_seiten
</VirtualHost>
Statt *:443 können Sie übrigens auch _default_:443 schreiben. Beide Varianten sorgen dafür, dass die <VirtualHost>-Definition für Port 443 unter sämtlichen Hostnamen und IP-Adressen gilt, unter denen der Server erreichbar ist.
Die Direktive SSLEngine schaltet die SSL-Funktion ein. SSLCertificateFile und SSLCertificateKeyFile wurden bereits erwähnt; sie binden das Zertifikat beziehungsweise den öffentlichen Schlüssel ein. In diesem Beispiel wurden die entsprechenden Dateien in das Verzeichnis ssl unterhalb des conf-Verzeichnisses kopiert.
Wenn Sie die DocumentRoot-Direktive weglassen, werden über die gesicherte Verbindung dieselben Inhalte veröffentlicht wie über die gesicherte. Dies ist in der Regel nicht besonders sinnvoll.
Starten Sie nun Ihren Webserver neu (gegebenenfalls mit der Option -DSSL) und geben Sie in Ihren Browser eine Adresse wie https://www.mynet.de ein. Nachdem der Browser sich über das ungültige (da selbst signierte) Zertifikat beschwert hat, sollte die Startseite der DocumentRoot erscheinen, die Sie im <Virtual-Host>-Container definiert haben. Damit ist Ihre SSL-Konfiguration im Prinzip beendet.
Rechtlicher Hinweis
Dieser Text ist ein Auszug aus dem Buch "Apache 2" von Sascha Kersken (Bonn 2004, Galileo Computing). Ohne ausdrückliche Genehmigung von Autor und Verlag darf er weder insgesamt noch in Teilen auf anderen Websites oder in sonstigen Medien veröffentlicht werden. Links auf diese Seite sind dagegen gestattet und ausdrücklich erwünscht.
Erforderliche Software
OpenSSL für UNIX erhalten Sie problemlos als Bestandteil Ihrer Systemdistribution oder unter www.openssl.org. mod_ssl ist Bestandteil der Apache-Quellcode-Distribution.
Für Windows können Sie sich hier die beiden benötigten Dateien herunterladen:
Bitte beachten: Ich übernehme keine Verantwortung dafür, wenn die Gesetze Ihres Landes Ihnen den Download und Einsatz dieser Dateien verbieten!
nach oben
Zur Übersicht
|