Dringendes Problem mit ssl (https) und Apache

Alles, was den Apache betrifft, kann hier besprochen werden.

Dringendes Problem mit ssl (https) und Apache

Postby sk-ynet » 22. February 2011 23:24

Hallo Leute,

folgendes Problem beschäftigt mich schon den ganzen Tag und ich komme einfach nicht zum Ziel, habe aber leider enormen Projektterminstress!

Es geht um einen Rootserver, alle Webanwendungen dürfen nur über https also ssl erreichbar sein, die Verschlüsselung der Verbindung reicht alleine aber nicht aus, es soll unabhängig von allen darunter liegenden Authentifizierungen, welche zum Beispiel über PHP programmiert sind, eine weitere globale Sicherheitsinstanz hinzukommen, ich habe da an ssl Authentifizierung gedacht, also nur wenn man ein gewisses Zertifikat auf dem Rechner hat, kann man sich verbinden, ansonsten lässt der Server einen sowieso nicht hin...
[Alternativvorschläge nehme ich gerne an, aber die verschlüsselte Verbindung ist obligatorisch]

Langer Rede kurzer Sinn,
Apache, PHP usw. ist alles schon länger funktionsfähig, habe heute unter Sites-available eine neue ssl Seite angelegt und aktiviert, das ssl Modul funktioniert auch, mit dem normalen public Key, laut Vorgabe, gab es auch noch keine Probleme, hätte soweit alles gepasst, soviel dazu! Leider habe ich nirgendwo ein verwendbares Tutorial gefunden, wie man Apache-ssl spezieller einrichtet, überall wird nur die normale "Public CA" Methode beschrieben, also ein Zertifikat für alle, lediglich zum Verschlüssen der Verbindung... eben leider zu wenig für mich, bei mir sollen nur ganz bestimmte Leute überhaupt Zugriff bekommen

Was habe ich wie getan?

1. Zuerst habe ich mal ssl generell aktiviert, laut Anleitung http://wiki.ubuntuusers.de/Apache/SSL
(Es ist ein Ubuntu Server 10.04)

2. Im Anschluss daran, habe ich es mit dem public Key getestet, hat alles soweit gepasst, öffentliches https war möglich, worauf ich in
die apache site "ssl-website" in "sites-available" ging (hab die zuvor so genannt) und dann habe ich die Zertifikatdateien, laut vorherigem Tutorrial,
ausgetragen...

3.
Nun habe ich, wie in einem Apache-Buch beschrieben, diese Datei heruntergeladen http://www.openssl.org/contrib/ssl.ca-0.1.tar.gz

Darin enthalten jeweils für "Root CA", "Server CA" und "Benutzer CA" eine sh zum erstellen und eine sh zum signieren, die erstellen dann einen Haufen Dateien, von crt bis key bis numerische .pem Einträge, wie gesagt, das Beispiel hab ich aus einem Apache Buch, in den SH Dateien, stehen die selben Befehle, wie in den meisten Tutorial, nur detailierter...

4.
Dann begann das große Herumprobieren, da ich kein Tutorial gefunden habe, welches genau das erklärte, was ich wollte und nach wie vor will und auch die "Apache Bibel", das Buch heißt echt so, nur die oberflächliche Methode, wie hier beschrieben http://wiki.ubuntuusers.de/Apache/SSL lieferte. Das mit dem http://www.openssl.org/contrib/ssl.ca-0.1.tar.gz kam zwar auch vom Buch, aber komischerweise, wurde das Einbinden danach nicht mehr beschrieben.

5.
Am Anfang habe ich einfach wild herum versucht, auch mithilfe von http://www.apache-ssl.org/docs.html und ähnlichen Seiten, ausgetestet, was, wie, wo geschieht, einmal, ganz kurz, hat es mit der Authentifizierung funktioniert. Nach dem Aufrufen des Servers, über HTTPS kam ein PopUp, da stand, dass der Server folgendes Zertifikat anfordert, nach dem Absenden, wurde die Verbindung erfolgreich aufgebaut... Nach dem ich dann aber testweise, alle Benutzerbezogenen Zertifikate vom Server gelöscht hatte und auch den Apache neu gestartet hatte, die Verbindung aber per https immer noch funktionierte, wusste ich, das was nicht stimmt, also zurück zum Reißbrett ...

6.
Mittlerweile bin ich frustriert,

in der "ssl-website" Datei, für den Apache Server, steht neben der üblichen Angaben, zu Servername und Rootverzeichnis, dann nur noch der Befehl zum aktivieren der ssl Engine,
dann habe ich "SSLCertificateFile" und "SSLCertificateKeyFile" das Serverzertifikat (server.crt) und Serverschlüssel(server.key) zugewiesen! Apache hat das auch geschluckt!
(Komischerweise ging es mit der "01.pem"(Beinhaltet die Server CA) welche die sh-skripten von vorhin erzeugten nicht, hier kam "Fail" beim Apache-Neustart. Die crt und key, was ebenfalls erzeugt werden, passen dann aber wieder...)

# SSLCACertificateFile
# SSLCACertificatePath

Habe ich beide schon mit allen Varianten und Möglichkeiten durchprobiert, hier sollten meines Verständnisses nach, dann die Benutzer Zertifikate/Schlüssel zugewiesen werden, wobei mir "SSLCACertificateFile" lieber wäre, als " SSLCACertificatePath ", da mir das mit den symlinks unsympathisch ist.

Darunter habe ich halt noch

#SSLVerifyClient

auf require

#SSLVerifyDepth

auf 10

und dann noch das was von Haus aus dabei ist, mit der Übergabe der Variablen an die aufgerufenen Dateien (php, phtml usw) und das keepalive Zeug, für den ie 6 und darunter...


Gesetzt habe ich also momentan

Code: Select all
SSLEnable on (Diesen Wert habe ich jetzt aus dem Kopf raus, bin grad nicht im Büro, war aber schon vorgegeben...)

SSLCertificateFile Pfad/server.crt
SSLCertificateKeyFile Pfad/server.key
SSLCACertificateFile   Keine Ahnung welches der 3 userspezifischen Dateien ich nehmen soll crt, key oder pem, keines von allem hat gepasst...
#SSLCACertificatePath
SSLVerifyClient  require



Auf jeden Fall, kommt egal was ich mache immer das hier, beim Aufrufen des Servers
Code: Select all
Fehler: Gesicherte Verbindung fehlgeschlagen

Ein Fehler ist während einer Verbindung mit www.innerebner.net aufgetreten.

Die SSL-Gegenstelle konnte keinen akzeptablen Satz an Sicherheitsparametern aushandeln.

(Fehlercode: ssl_error_handshake_failure_alert)

    *   Die Website kann nicht angezeigt werden, da die Authentizität der erhaltenen Daten nicht verifiziert werden konnte.

    *   Kontaktieren Sie bitte den Inhaber der Website, um ihn über dieses Problem zu informieren. Alternativ können Sie auch die Funktion im Hilfe-Menü verwenden, um diese Website als fehlerhaft zu melden.

 


Ich glaub der Browser weiß nicht mal dass er ein Zertifikat senden soll, ach ja, bevor ichs vergesse, im Firefox hab ich natürlich auch schon alles mögliche an Zertifikaten eingetragen, gelöscht und Kombinationen durchprobiert, von user@mail.xxx.p12 bis hin zu allen Zertifikaten (Name absichtlich verändert), nicht dass ihr denkt, der Idiot trag kein Zertifikat ein und wunder sich dass nix passiert :)


Bitte dringend um detaillierte Hilfe, hätte auch nix gegen ausführliche Step by Step Anleitungen, danke Euch im Voraus

liebe Grüße

skynet
sk-ynet
 
Posts: 1
Joined: 22. February 2011 20:51

Re: Dringendes Problem mit ssl (https) und Apache

Postby glitzi85 » 06. March 2011 14:22

Hallo,

ich hab dir mal eine kleine Anleitung zusammengeschrieben. Unter Ubuntu muss OpenSSL übrigens nicht manuell heruntergeladen werden:
Code: Select all
apt-get install openssl

Wenn du dann öfter damit arbeitest, kannst du dir auch eine openssl.cnf schreiben, aber für den Anfang ist das gar nicht nötig. Damit sparst du dir später nur einiges an Tipparbeit. Für diesen Einsatzzweck geht es aber auch ohne.
Am besten erstellst du dir irgendwo einen Ordner und testest das ganze erstmal darin. Alle Befehle gehen davon aus, dass du in einem leeren Ordner bist und auch darin bleibst, sonst musst du die ganzen Pfade natürlich relativ angeben.

Als erstes eine CA erstellen, 10 Jahre gültigkeit ist sinnvoll.
Code: Select all
openssl req -x509 -days 3650 -newkey rsa:4096 -keyout ca.key -out ca.crt

Als erstes wirst du nach einem Passwort gefragt. Dieses Passwort ist extrem wichtig. Damit wird deine CA geschützt. Wer dieses Passwort hat (und die ca.key) kann beliebige Zertifikate signieren und damit dann schlussendlich auf deinen Server zugreifen!
Alle anderen Fragen kannst du ausfüllen, musst du aber nicht. Steht halt nachher alles im Zertifikat drin, sollte also im Livebetrieb schon irgendwie sinnn machen, dann lohnt sich auch eine openssl.cnf, denn damit kannst du die Vorauswahl ändern und dir einiges an Tipparbeit sparen. Einzig beim Common Name (CN) solltest du darauf achten, dass es da niemals zwei gleiche gibt. Bei der CA ist das noch egal, da kannst du einen beliebigen nehmen wie rootca.example.com.
Jetzt am besten gleich die Datei ca.key schützen (chmod 0400 ca.key). Diese Datei darf niemals veröffentlich werden!
Die Datei ca.crt wird im Webserver als SSLCACertificateFile eingebunden.

Das Zertifikat für den Server ist optional. Falls du bereits ein gültiges Zertifikat hast, kannst du natürlich auch das nehmen. Falls dabei ein Zwischenzertifikat notwendig ist, dann musst du eine neue Datei erstellen (cabundle.crt) und in diese sowohl das externe Zwischenzertifikat als auch dein eigenes CA Zertifikat (ca.crt) reinpacken (Einfach ein Zertifikat nach dem anderen) und dieses dann als SSLCACertificateFile angeben.

Falls du für den Server ein eigenes Zertifikat verwenden möchtest, dann MUSST du in diesem Schritt bei Common Name die Domain angeben, für die das alles bestimmt ist, sonst bekommst du später bei der Authentifizierung Fehlermeldungen, die der User auch nicht unterdrücken könnte! Ab hier empfiehlt es sich, für Common Name und Dateiname immer die gleichen Werte zu verwenden. Damit kannst du einfach eine auflistung aller Zertifikate machen und siehst gleich welcher Computer schon eines hat.

Als erstes Key/CSR für den Server erstellen:
Code: Select all
openssl req -new -nodes -newkey rsa:4096 -keyout domain.key -out domain.csr

und daraus ein Zertifikat (Hier kannst du auch weniger als 10 Jahre nehmen):
Code: Select all
openssl x509 -req -days 3650 -in domain.csr -out domain.crt -CA ca.crt -CAkey ca.key -CAcreateserial

Das CSR kannst du löschen, domain.key und domain.crt müssen im Apache als SSLCertificateKeyFile und SSLCertificateFile eingebunden werden.
An dieser Stelle kannst du den Apachen schonmal neu starten. Jetzt hast du eine verschlüsselte Verbindung, bei der sich allerdings nur der Server authentifiziert. Außerdem musst du noch die ca.crt in den Browser einbinden, damit die Warnmeldung verschwindet. Kommen wir zur anderen Richtung.

Die Clients werden im Prinzip genau gleich wie der Server erstellt. Hier ist es prinzipiell egal was du als Common Name angibst, da dieser Wert nicht validiert werden kann (der Client sendet ja keinen Hostnamen von sich mit). Allerdings ist es sinnvoll, hier einen gewissen internen Standard zu verwenden. Wir verwenden hier beispielsweise den Hostnamen des Rechners in der Domäne (allerdings für OpenVPN zertifikate). Bei dir wäre dann vermutlich der Name des Mitarbeiters oder seine Personalnummer oder sowas sinnvoll. Wichtig ist, dass du später ein Zertifikat einfach zuordnen kannst, falls du es zurückziehen musst (z.B. weil der mitarbeiter entlassen wurde).

Als erstes wieder Key/CSR für den Client erstellen:
Code: Select all
openssl req -new -nodes -keyout clientname.key -out clientname.csr

und wieder ein Zertifikat daraus, zur Sicherheit würde ich das allerdings nur 1 oder 2 Jahre gelten lassen:
Code: Select all
openssl x509 -req -days 365 -in clientname.csr -out clientname.crt -CA ca.crt -CAkey ca.key -CAcreateserial

Das CSR kannst du wieder löschen.

Damit das ganze im Browser akzepiert wird, musst du das Teil jetzt noch zu einem PKCS#12 zusammenpacken:
Code: Select all
openssl pkcs12 -export -inkey clientname.key -in clientname.crt -out clientname.p12

Es wird nach einem Export-Passwort gefragt. Du kannst auch keins angeben (einfach leer lassen), allerdings sichert dieses Passwort das ganze nochmal bei der Übertragung ab. Du kannst einem neuen MA das Zertifikat als Mail schicken, das Passwort muss er aber persönlich abholen, nur mal so als Beispiel.

Sobald du dieses Zertifikat im Browser eingebunden hast, müsste er dich beim ersten mal fragen, welches Zertifikat verwendet werden soll. Hier die Apache-Config, wie sie bei mir funktioniert hat:

Code: Select all
<VirtualHost IP:443>
        ServerName server
        ServerAdmin webmaster@localhost
        DocumentRoot /var/www
        <Directory /var/www/>
                Options None
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        SSLEngine On
        SSLVerifyClient require
        SSLCACertificateFile /srv/myca/ca.crt
        SSLCertificateFile /srv/myca/server.crt
        SSLCertificateKeyFile /srv/myca/server.key

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
</VirtualHost>


Getestet auf Debian Lenny 5.0.8 mit
- OpenSSL 0.9.8g 19 Oct 2007
- Apache/2.2.9
- Firefox 3.6.13 (Windows XP)

Falls du Zertifikate auch wieder entziehen möchtest, musst du eine CRL (Certificate Revocation List) erstellen. in diese werden alle Zertifikate deiner CA eingetragen, die nicht mehr gelten. Diese Datei wird dann mit SSLCARevocationFile in den Webserver eingebunden. Allerdings benötigst du zum erstellen so einer Datei eine openssl.cnf. Das hab ich allerdings auch noch nie gemacht, da musst du also selber ein Tutorial dafür suchen.

glitzi
User avatar
glitzi85
 
Posts: 1920
Joined: 05. March 2004 23:26
Location: Dahoim


Return to Apache

Who is online

Users browsing this forum: No registered users and 3 guests