Ein Weiser gibt nicht die richtigen Antworten, er stellt die richtigen Fragen.
-- Claude Levi-Strauss
Dieses Kapitel enthält eine Reihe häufig gestellte Fragen (FAQs) und
die entsprechenden Antworten in Anlehnung an die beliebte USENET-Tradition.
Die meisten Fragen tauchten in der Newsgroup
comp.infosystems.www.servers.unix oder der mod_ssl Support
Mailing List modssl-users@modssl.org auf. Sie wurden an dieser Stellte
gesammelt, damit nicht immer wieder die gleichen Fragen beantwortet werden
müssen.
Bitte lesen Sie dieses Kapitel einmal vor der
mod_ssl-Installation durch oder suchen Sie wenigstens in ihr nach
Lösungen für Ihre Probleme, bevor Sie eine Nachricht an den Autor senden.
mod_ssl?mod_ssl und das Jahr 2000mod_ssll und die Wassenaar-Abkommen?mod_ssl?Das mod_ssl-Paket Version 1 wurde im April 1998 von Ralf S. Engelschall durch
Portierung der
Apache-SSL 1.17 Source-Patches
für Apache 1.2.6 bis Apache 1.3b6 von
Ben Laurie erstellt.
Aufgrund von Konflikten mit Ben Laurie's Entwicklungszyklus wurde es
für Apache 1.3.0 insgesamt neu zusammengestellt, indem die alte
mod_ssl-Version 1.x mit der neueren Apache-SSL-Version 1.18
vermischt wurde. Von diesem Punkt an führte mod_ssl
mit der Version 2 ein eigenes Leben. Die erste
veröffentlichte Version war am 10. August 1998 mod_ssl 2.0.0.
Im August 1999 war die mod_ssl-Version 2.4.0 die aktuelle
Version.
Nach einem Jahr mit intensiver Entwicklung mit über 1000 Arbeitsstunden
und über 40 Neufassungen erreichte mod_ssl den aktuellen
Stand. Das Ergebnis ist eine bereits sehr saubere Quellcodebasis, die sehr
umfangreiche Funktionalität implementiert. Der Umfang hat sich um den
Faktor 4 auf derzeit insgesamt über 10.000 Zeilen ANSI C-Code vergrößert
(70% Code und 30% Dokumentation). Vom ursprünglichen Apache-SSL-Code
sind nur zirka 5% übrig geblieben.
Nach dem die US-Bestimmungen für den Export von kryptografischer
Software aufgehoben wurden, wurde mod_ssl 2001 in den Code
der Apache-Version 2 integriert.
mod_ssl Jahr-2000-kompatibel?Ja, mod_ssl ist Jahr-2000-kompatibel.
Zum einen weil mod_ssl intern Jahreszahlen niemals
mit zwei Zahlen speichert. Es wird immer der numerische Datentyp von
ANSI C und POSIX (time_t) verwendet, der bei fast
allen Unix-Betriebssystemen zur Zeit den Typ signed long
hat (normalerweise 32 Bit) und die seit dem 1. Januar 1970 00:00 Uhr UTC
vergangene Zeit angibt. Dieser Vorzeichenwert läuft frühsten im Januar 2038
und nicht im Jahr 2000 über. Zum anderen erfolgen die Datums- und
Zeitdarstellungen (zum Beispiel die Variable %{TIME_YEAR})
mit vollständiger Angabe der Jahreszahl und nicht mit einer zweistellligen
Abkürzung.
Außerdem ist nach einer Jahr-2000-Erklärung der Apache Group der Apache-Webserver ebenfalls Jahr-2000-kompatibel. Ob allerdings OpenSSL oder das zugrundeliegende Betriebssystem (Unix oder Win32) Jahr-2000-kompatibel sind, ist eine andere Frage, die hier nicht beantwortet werden kann.
mod_ssl und
das Wassenaar-Abkommen?Zuerst soll erklärt werden, was das Wassenaar-Abkommen über Exportkontrollen für konventionelle Waffen und "dual use" Güter und Technologien ist: Im Jahr 1995 wurde eine internationale Organisation eingerichtet, die den Handel mit konventionellen Waffen und zivilen Gütern sowie Technologien, die auch waffentauglich sind, kontrollieren soll. Sie ersetzt die frühere CoCom. Das Abkommen wurde von 33 Ländern unterzeichnet: Argentinien, Australien, Belgien, Bulgarien, Kanada, Dänemark, Deutschland, Finnland, Frankreich, Griechenland, Großbritannien, Irland, Italien, Japan, Korea, Luxemburg, Niederlande, Neuseeland, Norwegen, Polen, Portugal, Rumänien, Russische Föderation, Österreich, Slowakische Republik, Spanien, Schweden, Schweiz, Tschechien, Türkei, Ukraine, Ungarn, USA. Weitere Informationen finden Sie unter http://www.wassenaar.org/.
Kurz zusammengefasst soll das Wassenaar-Abkommen den Aufbau militärischer Fähigkeiten verhindern, die regionale und internationale Sicherheit und Stabilität bedrohen. Das Wassenaar-Abkommen kontrolliert den Export von Verschlüsselungssoftware als Gut mit sowohl militärischen als auch zivilen Anwendungsmöglichkeiten. Das Wassenaar-Abkommen schließt aber Software für den Massenbedarf sowie Free Software aus.
Die aktuelle Wassenaar List of Dual Use Goods und Technologies
and Munitions sagt unter GENERAL SOFTWARE NOTE (GSN)
The Lists do not control "software" which is either: 1. [...] 2. "in
the public domain".
und unter DEFINITIONS OF TERMS USED IN
THESE LISTS
findet sich die Definition: In the public
domain": This means "technology" or "software" which has been made
available without restrictions upon its further dissemination. N.B.
Copyright restrictions do not remove "technology" or "software" from being
"in the public domain".
Sowohl mod_ssl und als auch OpenSSL fallen
also im Sinne des Wassenaar-Abkommens und der Liste der
"dual use" Güter und Technologien
in Bereich public domain
.
mod_ssl und OpenSSL sind also nicht vom
Wassenaar-Abkommen betroffen.
Ein Core Dump kann selbstverständlich unterschiedliche Ursachen haben,
angefangen von fehlerhaften Modulen von Fremdherstellern über
fehlerhafte Bibliotheken bis hin zu einer fehlerhaften
mod_ssl-Version. Häufig wird die oben beschriebene Situation
aber durch ältere oder beschädigte DBM-Bibliotheken anderer Hersteller
ausgelöst. Um das Problem zu beheben, muss mod_ssl
entweder mit der integrierten SDBM-Bibliothek aufgebaut werden (geben Sie
--enable-rule=SSL_SDBM in der APACI-Befehlszeile ein) oder
von SSLSessionCache dbm: zur neueren
SSLSessionCache shm:-Variante gewechselt werden (nachdem
Sie den Apache mit MM neu aufgebaut haben).
Wenn Sie Einträge wie mod_ssl: Child could not open
SSLMutex lockfile /opt/apache/logs/ssl_mutex.18332 (System error follows)
[...] System: Permission denied (errno: 13) erhalten, dann werden
diese in der Regel durch zu stark eingeschränkte Berechtigungen für
übergeordnete Verzeichnisse ausgelöst. Sorgen Sie dafür, dass für
alle übergeordneten Verzeichnisse (in diesem Fall /opt,
/opt/apache und /opt/apache/logs) das x-Bit
mindestens für die UID gesetzt ist, unter welcher die Apache-Kindprozesse
laufen (siehe
Das zusätzliche MByte wird durch den globalen Shared Memory-Pool
verursacht, den der Apache für alle Module allokiert und der aus verschiedenen
Gründen nicht von mod_ssl benutzt wird. Der tatsächlich
allokierte Shared Memory-Bereich ist immer um 1 MByte größer als mit der
mod_ssl beim
Serverstart mit der Fehlermeldung Failed to generate temporary 512 bit
RSA private key?Kryptografie-Software benötigt für die korrekte Funktion eine Quelle mit
zufälligen Daten. Viele Open Source-Betriebssysteme stellen für diesen Zweck
ein "Randomness Device" zur Verfügung (normalerweise unter der Bezeichnung
/dev/random). Bei anderen Systemen müssen die Anwendungen
den OpenSSL Pseudo Random Number-Generator (PRNG) manuell mit den
entsprechenden Daten aktivieren, bevor Schlüssel erzeugt oder eine
Verschlüsselung durchgeführt wird. Ab Version 0.9.5 melden die
OpenSSL-Funktionen, die den PRNG benötigen, einen Fehler, wenn
dieser nicht mit mindestens 128 Bits aktiviert wurde. mod_ssl
muss also genügend Entropie für den PRNG bereitstellen, was mit den
SSLRandomSeed-Direktiven geschieht.
SSL_XXX-Variablen?Ja, HTTP und HTTPS benutzen unterschiedliche Server-Ports, so dass es keine Konflikte zwischen beiden gibt. Es können entweder zwei Serverinstanzen ausgeführt werden (eine wird an Port 80, die andere an Port 443 gebunden) oder Sie wählen die elegante virtuelle Variante, bei der zwei virtuelle Server vom Apache für Port 80 und HTTP und einer für Port 443 und HTTPS eingeteilt werden.
HTTPS kann über jeden Port laufen, der Standard gibt aber Port 443 an,
den jeder HTTPS-kompatibele Browser berücksichtigt.
Wenn Sie in der URL den Port mit angeben
(https://secure.server.dom:666/), dann überwacht der
Browser auch diesen Port (hier Port 666):
Während ein einfacher Test des HTTP-Protokolls wie folgt durchgeführt werden kann
ist das für HTTPS nicht so einfach, weil das SSL-Protokoll zwischen
TCP und HTTP liegt. Aber mit Hilfe des OpenSSL-Befehls
s_client kann auch HTTPS überprüft werden:
Vor der eigentlichen HTTP-Antwort erhalten Sie detaillierte Informationen über das SSL-Handshake. Für einen universelleren Befehlszeilen-Client, der sowohl HTTP als auch HTTPS versteht, die Methoden GET und POST ausführen und einen Proxy benutzen kann, Bytebereiche unterstützt usw. sollten Sie das Hilfsprogramm cURL benutzen. Hiermit können Sie direkt testen, ob Ihr Apache an den Ports 80 und 443 richtig funktioniert:
Weil Sie über HTTP eine Verbindung zum HTTPS-Port hergestellt haben,
beispielsweise mit einer URL in der Form http:// an Stelle
von https://. Das passiert auch anders herum, wenn Sie über
HTTPS eine Verbindung zu einem HTTP-Port herstellen wollen und
https:// für einen Server verwenden, der SSL (über diesen Port)
nicht unterstützt. Stellen Sie sicher, dass Sie eine Verbindung zu einem
virtuellen Server herstellen, der SSL unterstützt (wahrscheinlich die IP-Adresse
des Hostnamens und nicht der lokale Host (127.0.0.1).
Connection Refused, wenn ich versuche, meinen gerade mit
mod_ssl installierten Apache-Server über HTTPS
anzusprechen?Das kann mehrere Gründe haben. Einer der weitverbreiteten Fehler ist, dass
der Apache nur mit apachectl start (oder httpd)
anstatt mit apachectl startssl (oder httpd -DSSL)
gestartet wird. Vielleicht stimmt auch die Konfiguration nicht. Überprüfen Sie,
ob die
mod_ssl.
SSL_XXX-Variablen nicht
vorhanden. Warum ist das so?Sie müssen SSLOptions +StdEnvVars für den Kontext
der CGI/SSI-Anfragen setzen.
Normalerweise müssen vollständig qualifizierte Hyperlinks benutzt
werden, weil das URL-Schema gewechselt werden muss. Mit Hilfe
einiger URL-Manipulationen über mod_rewrite können
Sie aber den gleichen Effekt erreichen und die relativen URLs weiter
verwenden:
Diese Manipulationsregeln erlauben die Verwendung von Hyperlinks
in der Form
<a href="document.html:SSL">
Die private RSA-Schlüsseldatei ist eine digitale Datei mit der Sie empfangene Nachrichten entschlüsseln können. Sie besitzt eine öffentliche Komponente, die Sie verteilen (über Ihre Zertifikatdatei). Das ermöglicht anderen, die an Sie gerichteten Nachrichten zu verschlüsseln. Ein Certifikate Signing Request (CSR) ist eine digitale Datei, die Ihren öffentlichen Schlüssel und Ihren Namen enthält. Die CSR wird an eine Certifying Authority (CA) gesendet, damit sie in ein richtiges Zertifikat umgewandelt wird. Ein Zertifikat enthält Ihren öffentlichen RSA-Schlüssel, Ihren Namen, den Namen der CA und ist vom CA digital signiert. Browser, die die CA kennen, können die Signatur dieses Zertifikats überprüfen und Ihren öffentlichen RSA-Schlüssel entgegennehmen. Sie können dann verschlüsselte Nachrichten versenden, die nur mit Ihrem Schlüssel entschlüsselt werden können. Im Kapitel Einführung finden Sie eine allgemeine Beschreibung des SSL-Protokolls.
Im Allgemeinen unterscheidet sich der Start des Apache-Servers mit
integriertem mod_ssl-Modul nicht vom einfachen
Apache-Start, allerdings mit dem Unterschied, dass beim Vorhandensein
einer Passphrase für die private SSL-Schlüsseldatei diese Passphrase
in einem Dialogfeld eingegeben werden muss.
Die manuelle Eingabe der Passphrase beim Serverstart kann problematisch sein, wenn der Server beispielsweise vom System-Bootskript gestartet wird. Als Alternative können Sie den im Abschnitt "Wie kann ich die Eingabe der Passphrase beim Apache-Start umgehen" beschriebenen Schritten folgen.
Führen Sie folgende Schritte durch:
PATH
angegeben ist. Einige Befehle funktionieren auch, wenn das Programm
openssl einfach innerhalb des OpenSSL-Zweiges mit
./apps/openssl ausgeführt wird.$ openssl genrsa -des3 -out server.key 1024server.key-Datei und merken Sie sich die
Passphrase, die Sie in einem geschützten Bereich eingegeben haben.
Die Details zu diesem privaten RSA-Schlüssel können Sie sich mit
folgendem Befehl anzeigen lassen:$ openssl rsa -noout -text -in server.key$ openssl rsa -in server.key -out server.key.unsecure$ openssl req -new -key server.key -out server.csrhttps://www.foo.dom/
zugegriffen wird, geben Sie www.foo.dom ein).
Die Details dieser CSR können Sie sich mit folgendem Befehl anzeigen
lassen:$ openssl req -noout -text -in server.csrserver.crt-Datei speichern können. Weitere Informationen
zu kommerziellen CAs finden Sie unter folgenden Adressen:$ openssl x509 -noout -text -in server.crtserver.key und
server.crt. In der httpd.conf-Datei des
Apache-Servers werden diese Dateien wie folgt benutzt:
SSLCertificateFile /path/to/this/server.crt
SSLCertificateKeyFile /path/to/this/server.key
Die server.csr-Datei wird nicht mehr benötigt.
Die kurze Antwort lautet: Benutzen Sie das OpenSSL-Skript
CA.sh oder CA.pl. Oder ausführlich:
$ openssl genrsa -des3 -out ca.key 1024ca.key-Datei und merken Sie sich die
geschützt eingegebene Passphrase. Die Details zu diesem
privaten RSA-Schlüssel werden mit folgendem Befehl angezeigt:$ openssl rsa -noout -text -in ca.key$ openssl rsa -in ca.key -out ca.key.unsecure$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt$ openssl x509 -noout -text -in ca.crtopenssl ca einige seltsame Anforderungen
stellt und die standardmäßige OpenSSL-Konfiguration keine einfache, direkte
Benutzung des Befehls openssl ca zulässt. Die
mod_ssl-Distribution enthält im Unterverzeichnis
pkg.contrib/ ein entsprechendes Skript mit der Bezeichnung
sign.sh. Benutzen Sie dieses Skript für die Signierung.
server.csr zur Hand):$ ./sign.sh server.csrserver.crt-Datei
erzeugt.Sie müssen Sie mit der alten Passphrase lesen und mit Angabe einer neuen Passphrase neu schreiben. Dies kann mit folgenden Befehlen geschehen:
$ openssl rsa -des3 -in server.key -out server.key.new
$ mv server.key.new server.key
Sie werden zweimal nach einer PEM-Passphrase gefragt. Beim erstenmal geben Sie die alte Passphrase ein und beim zweiten Mal die neue.
Die Ursache, warum der Dialog bei jedem Start und Neustart geöffnet
wird, ist die Tatsache, dass der private RSA-Schlüssel in der Datei
server.key aus Sicherheitsgründen verschlüsselt gespeichert
ist. Die Passphrase wird benötigt, um diese Datei lesen und analysieren zu können.
Wenn Sie sicher sind, dass Ihr Server genug gesichert ist, führen Sie zwei Schritte durch:
$ cp server.key server.key.org$ openssl rsa -in server.key.org -out server.keyserver.key-Datei für
root lesbar ist:$ chmod 400 server.keyDie Datei server.key enthält jetzt eine unverschlüsselte
Kopie des Schlüssels. Stößt der Server jetzt auf die Datei, fragt er
nicht mehr nach einer Passphrase. Fällt allerdings dieser Schlüssel einem
anderen in die Hände, dann kann er sich als Ihre Person ausgeben. Sorgen
Sie deshalb dafür, dass die Berechtigungen für diese Datei so zugewiesen
werden, dass nur root oder der Webserver sie lesen
können (vorzugsweise sollte der Webserver als root
gestartet werden und der Schlüssel nur für diesen Benutzer lesbar sein).
Alternativ können Sie auch die Anweisung SSLPassPhraseDialog
exec:/Pfad/zum/Programm verwenden. Allerdings ist diese Variante
genauso sicher bzw. unsicher.
Der private Schlüssel enthält eine Reihe von Zahlen. Wählen Sie zwei Zahlen aus dem "öffentlichen Schlüssel", die anderen sind Bestandteil des "privaten Schlüssels". Die "öffentlichen Schlüsselbits sind ebenfalls in Ihr Zertifikat eingebettet (Sie erhalten Sie mit der CSR). Um zu überprüfen, ob der öffentliche Schlüssel im Zertifikat mit dem öffentlichen Teil des privaten Schlüssels übereinstimmt, müssen Sie die Zahlen des Zertifikats und des Schlüssels miteinander vergleichen. Mit den folgenden Befehlen können Sie sich Zertifikat und Schlüssel anzeigen lassen:
$ openssl x509 -noout -text -in server.crt
$ openssl rsa -noout -text -in server.key
Die Bestandteile für den Modulus und den öffentlichen Exponenten des Schlüssels und des Zertifikats müssen übereinstimmen. Da der öffentliche Exponent normalerweise den Wert 65537 hat und der Vergleich mit einem langen Modulus umständlich ist, können Sie auch folgendes tun:
$ openssl x509 -noout -modulus -in server.crt | openssl md5
$ openssl rsa -noout -modulus -in server.key | openssl md5
Vergleichen Sie diese wirklich kurzen Zahlen miteinander. Aller Wahrscheinlichkeit nach unterscheiden Sie sich, wenn die Schlüssel sich unterscheiden. Mit der folgenden Anweisung kann berechnet werden, zu welchem Schlüssel oder Zertifikat eine bestimmte CSR gehört:
$ openssl req -noout -modulus -in server.csr
| openssl md5
alert bad certificate
abgebrochen werden?Wenn Fehler wie OpenSSL: error:14094412: SSL
routines:SSL3_READ_BYTES:sslv3 alert bad certificate in
der SSL-Protokolldatei auftauchen, bedeutet das normalerweise, dass der
Browser nicht mit dem Serverzertifikat oder dem privaten Schlüssel
umgehen konnte, die vielleicht einen RSA-Schlüssel enthalten, der nicht
1.024 Bit groß ist. Einer dieser Browser ist zum Beispiel der Netscape
Navigator 3.x.
Die privaten Schlüsselgrößen für SSL müssen für die Kompatibilität zu bestimmten Webbrowsern entweder 512 oder bei 1.024 Bit groß sein. Eine Schlüsselgröße von 1.024 Bit ist zu empfehlen, weil größere Schlüssel inkompatibel zu einigen Browser-Versionen des Netscape Navigators und des Microsoft Internet Explorers sowie zu anderen Browsern sind, die das BSAFE-Kryptografie-Toolkit von RSA verwenden.
Die im mit SSLCACertificatePath konfigurierten Pfad
befindlichen CA-Zertifikate werden von SSLeay über Hashwerte gefunden.
Diese Hashwerte werden mit den Befehl openssl x509 -noout -hash
erzeugt. Der Algorithmus für die Hashwertberechnung bei Zertifikaten hat sich
mit der SSLeay-Version 0.9 geändert. Die alten Hashwerte müssen daher
entfernt und nach dem Upgrade neu erzeugt werden. Benutzen Sie hierfür
das Makefile mod_ssl aus diesem Verzeichnis.
Das Standardformat für SSLeay-/OpenSSL-Zertifikate ist das
PEM-Format, bei dem es sich um ein Base64-verschlüsseltes DER-Format
mit Kopf- und Fußzeilen handelt. Für einige Anwendungen (z.B. für den
Microsoft Internet Explorer) benötigen Sie das Zertifikat im einfachen
DER-Format. Sie können die PEM-Datei certificate.pem in
die entsprechende DER-Datei certificate.der mit folgendem Befehl
umwandeln:
$ openssl x509 -in certificate.pem -out
certificate.der -outform DER
getca noch das
Programm getverisign, die von Verisign erwähnt werden?Das liegt daran, dass Verisign keine speziellen Instruktionen für
Apache und mod_ssl angibt, sondern sich auf Stronghold von
C2Net bezieht (eine kommerzielle Apache-Variante mit SSL-Unterstützung).
Sie müssen lediglich das Zertifikat in einer Datei sichern und den Namen dieser
Datei der SSLCertificateFile-Direktive übergeben. Beachten Sie,
dass auch die Schlüsseldatei angegeben werden muss (siehe
SSLCertificateKeyFile-Direktive). Einen besseren Überblick
zu CAs und SSL-Zertifikaten finden Sie in den mod_ssl-Anweisungen von Thawte.
mod_ssl verwenden?Ja, mod_ssl unterstützt seit der Version2.1 das
SGC-Programm. Spezielle Konfigurationen sind hierfür nicht erforderlich,
Sie müssen lediglich eine globale ID als Serverzertifikat verwenden.
Die heraufgesetzten Clients werden dann zur Laufzeit automatisch
von mod_ssl behandelt. Einzelheiten hierzu finden Sie in der
Datei README.GlobalID der
mod_ssl-Distribution.
Verisign verwendet ein zwischen dem Root-CA-Zertifikat (in den Browsern
installiert) und dem Serverzertifikat (im Server installiert) liegendes CA-Zertifikat.
Dieses zusätzliche CA-Zertifikat sollten Sie von Verisign erhalten haben. Falls nicht,
reklamieren Sie das. Richten Sie dieses Zertifikat mit der
SSLCertificateChainFile-Direktive auf dem Server ein. Damit wird
sichergestellt, dass dieses dazwischen liegende CA-Zertifikat an den Browser
gesendet und das Loch in der Zertifikatkette gestopft wird.
Das kann mehrere Gründe haben, meist handelt es sich aber um Probleme
mit dem SSL-Session-Cache, der mit der
Weil SSL eine starke kryptografische Verschlüsselung benutzt und dafür viele Berechnungen durchführen muss. Ferner werden bei einer Anfrage über HTTPS auch Bilder verschlüsselt übertragen. Liegt viel HTTPS-Verkehr an, steigt daher die Serverbelastung.
Normalerweise liegt das an der Verwendung eines
/dev/random-Geräts für
SSLRandomSeed-Direktive, die bei
read(2)-Aufrufen blockiert wird, wenn nicht genügend Entropie
zur Verfügung steht. Mehr hierzu finden Sie im Abschnitt über
SSLRandomSeed.
mod_ssl unterstützt?Normalerweise werden alle SSL-Algorithmen unterstützt, die von der verwendeten OpenSSL-Version unterstützt werden (in Abhängigkeit davon, wie OpenSSL eingerichtet wurde). Üblicherweise gehören mindestens die folgenden Algorithmen dazu:
Mit folgendem Befehl können Sie die aktuell unterstützten Algorithmen ermitteln:
no shared cipher-Fehlermeldungen.
Woran liegt das?Um anonyme Diffie-Hellman-Algorithmen (ADH) verwenden zu können,
reicht es nicht aus, einfach nur ADH in die
SSLCipherSuite-Anweisung einzufügen. OpenSSL muss außerdem
mit -DSSL_ALLOW_ADH eingerichtet werden. Da OpenSSL
aus Sicherheitsgründen standardmäßig keine ADH-Algorithmen zulässt, sollten Sie
sich über die Nebenwirkungen informieren, bevor Sie diese Algorithmen
aktivieren.
Das hat technische Ursachen und ist mit der Frage vergleichbar, ob das Ei
oder die Henne zuerst da war. Die SSL-Protokollschicht steht über der
HTTP-Protokollschicht und kapselt HTTP ein. Wird eine SSL-Verbindung
(HTTPS) eingerichtet, muss das Apache-Modul mod_ssl
die SSL-Protokollparameter mit dem Client aushandeln. Hierfür muss
mod_ssl die Konfiguration des virtuellen Servers zu Rate ziehen
(beispielsweise muss nach den Algorithmen, dem Serverzertifikat usw. gesehen
). Um den richtigen virtuellen Server auswählen zu können, muss der Apache
das HTTP-Header-Feld Host kennen. Dafür muss der
HTTP-Anfrage-Header gelesen werden. Das kann nicht geschehen, bevor
der SSL-Handshake abgeschlossen ist. Diese Information wird aber bereits in der
Phase des SSL-Handshake benötigt. Bingo!
Das auf Namen basierende virtuelle Hosting ist eine sehr beliebte Methode zur Identifizierung unterschiedlicher virtueller Hosts. Sie erlaubt die Verwendung der gleichen IP-Adresse und der gleichen Portnummer für viele unterschiedliche Sites. Beim Wechsel zu SSL scheint es nur natürlich, anzunehmen, dass die gleiche Methode für viele unterschiedliche virtuelle SSL-Hosts auf dem gleichen Server verwendet werden kann.
Wenn erkannt wird, dass das nicht möglich ist, kommt es dann meist zu einem bösen Erwachen.
Die Ursache liegt darin, dass das SSL-Protokoll eine eigene Schicht ist,
die das HTTP-Protokoll einkapselt. Daher ist die SSL-Session eine separate
Transaktion, die noch vor der HTTP-Session stattfindet. Der Server erhält nur
eine SSL-Anfrage unter der IP-Adresse X und am Port Y (normalerweise 443).
Da die SSL-Anfrage kein Host:-Feld enthält, kann der Server nicht
entscheiden, welchen virtuellen SSL-Host er verwenden soll. Normalerweise benutzt
er den ersten, der mit dem Port und der IP-Adresse übereinstimmt.
Selbstverständlich kann das auf Namen basierende virtuelle Hosting zur
Identifikation vieler virtueller Hosts ohne SSL verwendet werden (zum Beispiel
alle über Port 80) und dann sind mehr als ein virtueller SSL-Host möglich
(über Port 443). In diesem Fall müssen Sie aber sicherstellen, dass die Portnummer,
die nicht für SSL benutzt wird, mit der Direktive NameVirtualHost
angegeben wird:
Weitere Möglichkeiten sind:
Die Verwendung separater IP-Adressen für unterschiedliche SSL-Hosts. Die Verwendung unterschiedlicher Port-Nummern für unterschiedliche SSL-Hosts.
Nein, Benutzername und Passwort werden bereits verschlüsselt übertragen. Das Icon der Netscape-Browser ist nicht richtig mit der SSL/TLS-Schicht synchronisiert (es wechselt in den gesperrten Zustand, wenn der erste Teil der Webseitendaten übertragen wurde, was nicht ganz korrekt ist) und verwirrt auf diese Weise die Anwender. Die Basic-Authentifizierung ist Bestandteil der HTTP-Schicht und diese Schicht liegt über der SSL/TLS-Schicht von HTTPS. Bevor eine HTTP-Datenkommunikation in HTTPS stattfindet, hat die SSL/TLS-Schicht bereits die Handshake-Phase abgeschlossen und zur verschlüsselten Kommunikation gewechselt. Lassen Sie sich deshalb nicht von dem Icon irritieren.
Zum einen weist die SSL-Implementierung einiger MSIE-Versionen subtile
Fehler hinsichtlich der HTTP-Keep-Alives und der SSL-Benachrichtigungen
beim Schließen von Socket-Verbindungen auf. Ferner erweist sich die
Interaktion zwischen SSL- und HTTP/1.1-Eigenschaften bei einigen
MSIE-Versionen ebenfalls als problematisch. Diese Probleme müssen dadurch
umgangen werden, dass der Apache OpenSSL-Server veranlasst wird, kein
HTTP/1.1 und keine Keep-Alive-Verbindungen zu verwenden oder die
SSL-Nachrichten beim Schließen der Socket-Verbindung an MSIE-Clients zu
senden.
Dies kann mit der folgenden Direktive im virtual host-Abschnitt
geschehen:
Darüber hinaus ist bekannt, dass einige MSIE-Versionen Probleme mit
bestimmten Algorithmen haben. Da die Algorithmen bereits in der
SSL-Handshake-Phase benutzt werden, lassen sich diese Fehler nicht nur für
diese bestimmten MSIE-Clients beheben( z.B. mit einer MSIE-spezifischen
Das nächste Problem ist eine fehlerhafte SSLv3-Implementierung der 56-Bit-Exportversionen bei den MSIE 5.x-Browsern, die schlecht mit OpenSSL-Versionen nach der Version 0.9.4 zusammenarbeitet. Sie können dies entweder akzeptieren und die Clients veranlassen, ihre Browser auszutauschen, oder Sie gehen zähneknirschend zurück zur OpenSSL-Version 0.9.4. Sie können auch die folgende Lösung wählen, wenn Sie die schrecklichen Auswirkungen für alle anderen Browser in Kauf nehmen möchten:
Damit wird das SSLv3-Protokoll vollständig deaktiviert und die fehlerhaften Browser bereiten keine Probleme mehr. Aber normalerweise ist das kein akzeptabler Ausweg. Vernünftiger wäre eine etwas gezieltere Behandlung des Problems, bei der nur die Algorithmen deaktiviert werden, die die Probleme verursachen:
SSLCipherSuite
ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
Bei dieser Lösung funktionieren auch die fehlerhaften MSIE-Versionen, denn nur die neueren 56-Bit TLS-Algorithmen werden deaktiviert.
Ein weiteres Problem mit MSIE 5.x-Clients ist ihre Weigerung, eine
Verbindung zu URLs der Form https://12.34.56.78/
(anstelle des Hostnamens werden IP-Adressen verwendet) herzustellen, wenn
Server Gated Cryptography (SGC) verwendet wird. Das kann nur
durch Verwendung des vollständig qualifizierten Domänennamens (FQDN)
der Website in Hyperlinks verhindert werden, weil MSIE 5.x die
SGC-Negotiation fehlerhaft ausführt.
Schließlich gibt es noch MSIE-Versionen, die scheinbar verlangen, dass
eine SSL-Session wiederverwendet werden kann (ein Verhalten, das allen
Standards widerspricht). Verbindungen mit solchen MSIE-Versionen
funktionieren nur, wenn ein SSL-Session-Cache verwendet wird. Als
Workaround kann der Session-Cache aktiviert werden (siehe
Netscape has encountered
bad data from the server. Was ist der Grund hierfür?Normalerweise ist ein mit dem gleichen DN erzeugtes Serverzertifikat die Ursache, wobei der Browser angewiesen wurde, weiterhin das alte Serverzertifikat zu akzeptieren. Wird der Eintrag für das alte Zertifikat aus dem Browser entfernt, funktioniert normalerweise wieder alles wie erwartet. Die SSL-Implementierung von Netscape ist korrekt, so dass I/O-Fehler beim Netscape Navigator meist durch die Konfiguration der Zertifikate verursacht werden.
mod_ssl-Probleme zur Verfügung?Folgende Informationsquellen sollten Sie bei Problemen zuerst zu Rate ziehen:
mod_ssl zur Verfügung?Die folgende Liste führt alle Möglichkeiten für Unterstützung bei
Problemen mit mod_ssl in der Reihenfolge auf, in der Sie genutzt
werden sollten.
mod_ssl-Benutzergemeinde diskutieren.
Folgende Informationen sollten mindestens in dem Bericht enthalten sein:
httpd -v
ermittelt werden'. Die OpenSSL-Version wird mit
openssl version abgefragt. Wenn Lynx installiert ist,
können alternativ mit dem Befehl lynx -mime_header
http://localhost/ | grep Server alle Informationen in einem Schritt
abgefragt werden.
mod_ssl und OpenSSLconfigure-Befehlszeile angeben.
Im Allgemeinen nicht, wenn nicht wenigstens weitere Informationen dazu geliefert werden, an welcher Codeposition der Apache mit dem Speicherauszug begonnen hat. Normalerweise wird immer ein Backtrace (siehe nächste Frage) benötigt, um helfen zu können. Ohne diese Informationen ist es meist unmöglich, das Problem zu erkennen und bei dessen Beseitigung zu helfen.
Führen Sie folgende Schritte durch:
mod_ssl mit dem Befehl
OPTIM="-g -ggdb3" einrichten. Bei anderen Betriebssystemen
ist mindestens OPTIM="-g" erforderlich.
CoreDumpDirectory /tmp verwenden, damit die Core Dump-Datei
geschrieben werden kann. Sie sollten dann eine Datei /tmp/core
oder /tmp/httpd.core erhalten. Ist das nicht der Fall,
versuchen Sie den Server unter der UID != 0 (root) auszuführen, weil die
meisten Serverkerne aus Sicherheitsgründen (es können sich noch geschützte
Informationen im Speicher befinden) keinem Prozess einen Core Dump
gestatten, nachdem setuid() abgeschlossen ist
(es sei denn, er führt exec() aus). Zusätzlich kann
/path/to/httpd -X ausgeführt werden, um den Apache manuell
am Aufspalten des Prozesses zu hindern.
gdb /path/to/httpd/tmp/httpd.core oder einen ähnlichen Befehl
aus. Beim GDB muss nur der bt-Befehl eingegeben werden
und schon erhalten Sie den Backtrace. Bei anderen Debuggern müssen Sie im
Handbuch nachschlagen. Schicken Sie den Backtrace an den Author.