XAMPP: SSL/HTTPS für lokale Projekte einrichten
Tutorial von Stefan Trost | Letztes Update am 05.05.2024 | Erstellt am 09.08.2017
In diesem Tutorial möchte ich euch zeigen, wie ihr eure XAMPP-Konfiguration so einrichten könnt, dass ihr eure lokalen PHP-Projekte auch über SSL beziehungsweise über eine HTTPS-URL im Browser erreichen könnt. Praktisch ist dies zum Beispiel für den Fall, dass auch eure Online-Website über HTTPS läuft und ihr so in beiden Fällen, also sowohl zum testen als auch in der echten Anwendung, dieselbe Linkstruktur nutzen könnt.
In meinem Tutorial über das Einrichten virtueller Domains hatte ich schon die Grundlagen dafür erklärt, wie man mit XAMPP und Apache beliebige Domains definieren kann, die dann auf ein lokales Verzeichnis in der XAMPP-Installation zeigen können. Nach dieser Einrichtung sind allerdings alle Domains im Browser zunächst nur über HTTP erreichbar. Um auch URLs über HTTPS zu erlauben, sind noch die folgenden weiteren zusätzlichen Schritte notwendig:
- Zertifikat erstellen
- VirtualHost definieren
- Apache neu starten
- Ausnahmen hinzufügen
- Zertifikat installieren
Im folgenden möchten wir uns jeden dieser Schritte im Detail ansehen.
Zertifikat erstellen
Zunächst müssen wir uns im ersten Schritt ein eigenes SSL-Zertifikat erstellen. Zum Glück hält XAMPP für uns bereits ein kleines Skript für diese Aufgabe bereit, das uns diese Arbeit erleichtert und das wir folgendermaßen öffnen und nutzen können:
- Das Skript finden wir im Apache-Ordner der XAMPP-Installation, bei einer Standard-Installation unter Windows ist das der Pfad: C:\xampp\apache
- In diesem Ordner finden wir die Datei makecert.bat. Mit einem Doppelklick auf die Datei können wir das Skript starten.
Nach dem Starten des Scripts öffnet sich die Kommandozeile, in der wir nur noch den Anweisungen folgen brauchen. Im folgenden möchten wir diese Anweisungen Schritt für Schritt durchgehen und erläutern, was einzugeben ist. Am Ende dieses Abschnitts findet ihr darüber hinaus dann noch einmal den kompletten Ablauf als Zusammenfassung ohne Kommentierung.
Das Skript startet mit der automatischen Generierung eines Private Keys unter dem Namen "privkey.pem". Währenddessen gibt uns das Skript folgendes Feedback über diesen Vorgang:
Generating a 2048 bit RSA private key ............+++ ...................+++ writing new private key to 'privkey.pem'
Danach sind wir zum ersten Mal selber gefragt und werden dazu aufgefordert, ein Passwort für unseren Key einzugeben. Das sollte so aussehen:
Enter PEM pass phrase: Verifying - Enter PEM pass phrase:
Hier können wir ein beliebiges Passwort verwenden und anschließend noch ein weiteres Mal wiederholen.
Anschließend folgen einige Fragen zum Ort und zur Organisation beziehungsweise zum Unternehmen auf das wir unser Zertifikat ausstellen möchten. Diese Angaben werden später in unser Zertifikat hineingeschrieben. Konkret geht es um die Fragen nach dem Land (Country Name), dem Bundesland (State or Province), der Stadt (Locality Name), dem Namen des Unternehmens oder der Organisation (Organization Name) sowie dem Namen der Abteilung (Organizational Unit Name):
Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:NRW Locality Name (eg, city) []:BOT Organization Name (eg, company) [Internet Widgits Pty Ltd]:STT Organizational Unit Name (eg, section) []:WEB
Da wir unser Zertifikat nur lokal benutzen möchten können wir hier im Prinzip alles eingeben, was wir möchten. Alternativ können wir auch einen Punkt eintippen wenn wir das jeweilige Feld freilassen möchten. Das Land muss in Form eines zweistelligen Ländercodes eingegeben werden (hier "DE" für Deutschland), alle anderen Felder erlauben auch mehr Zeichen. In unserem Beispiel haben wir neben "DE" (Deutschland) die Angaben "NRW" (Nordrhein-Westfalen), "BOT" (Bottrop), "STT" (als Unternehmen) sowie "WEB" als Organisationseinheit verwendet.
Anschließend folgt die Frage nach dem "Common Name" ("FQDN" steht hier für "Fully Qualified Domain Name"):
Common Name (e.g. server FQDN or YOUR name) []:*.example.com
Hier können wir die Domain unserer Internetseite eingeben, für die das Zertifikat ausgestellt werden soll. Um später im Browser ein grünes Schloss zu erhalten, muss der Name der Domain exakt mit der URL übereinstimmen.
Wenn das Zertifikat für nur eine Domain wie www.example.com ausgestellt werden soll, ist hier "www.example.com" anzugeben. Wenn eure Domain auch Subdomains hat, könnt ihr ein Wildcard-Zertifikat ausstellen, indem ihr zum Beispiel "*.example.com" eingebt. Mit *.example.com umfasst das Zertifikat dann sowohl www.example.com als auch alle denkbaren Subdomains wie beispielsweise de.example.com oder en.example.com.
Wenn ihr mehrere verschieden lautende Domains habt, könnt ihr leider nicht so etwas wie "*" oder "*.*" angeben. Stattdessen könnt ihr den Vorgang einfach für jede einzelne eurer Domains wiederholen, um für jede Domain ein eigenes Zertifikat zu erhalten - falls ihr Wert auf das grüne Schloss im Browser legt. Alternativ könnt ihr nämlich auch einfach "localhost" angeben und für jede eurer Domains das gleiche Zertifikat verwenden. Dadurch erhaltet ihr im Browser zwar kein grünes Schloss, jedoch funktioniert der Seitenaufruf trotzdem, was für Testzwecke in der Regel ausreichen sollte. Wenn ihr auf das dann rote Schloss klickt, erhaltet ihr die Angabe "Server's Certificate does not match the URL", ansonsten solltet ihr keine Unterschiede bemerken.
Email Address []:local@example.com
Als nächstes folgt die Frage nach einer E-Mail-Adresse. Auch hier können wir wieder eine beliebige Adresse angeben, da wir unter dieser Adresse nicht erreichbar sein müssen. Wir haben uns hier für "local@example.com" entschieden.
Es folgen zwei weitere Fragen nach den sogenannten Extra-Attributen "challenge password" und einem "optional company name":
A challenge password []:. An optional company name []:.
Beide dieser Fragen können wir auslassen, indem wir sie mit der Eingabe eines Punktes quittieren. Das sogenannte "Challenge Passwort" ist sowieso weder im Zertifikat noch im Schlüssel enthalten und war ursprünglich lediglich dafür gedacht, sich bei der Zertifizierungsstelle ausweisen zu können, um das Zertifikat zu sperren. Damit sollte verhindert werden, dass jemand, der nur im Besitz des Zertifikats und des Schlüssels ist, das Zertifikat widerrufen kann. In der Praxis hat das allerdings nie eine wirklich große Rolle gespielt und für uns, die wir das Zertifikat nur lokal benutzen möchten, sowieso nicht.
Zuletzt müssen wir noch einmal das Passwort vom Beginn wiederholen:
Enter pass phrase for privkey.pem:
Wenn dieses Passwort mit der vorherigen Eingabe übereinstimmt, wird unser Zertifikat erstellt. Nachdem wir die Rückmeldung erhalten haben, dass unser Zertifikat fertig ist, können wir eine beliebige Taste drücken um das Kommandozeilenfenster zu schließen.
Der gesamte Vorgang sieht dann beispielsweise so aus:
Generating a 2048 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) []:BOT Organization Name (eg, company) [Internet Widgits Pty Ltd]:STT Organizational Unit Name (eg, section) []:WEB Common Name (e.g. server FQDN or YOUR name) []:*.example.com Email Address []:local@example.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:. An optional company name []:. Enter pass phrase for privkey.pem: writing RSA key Signature ok subject=/C=DE/ST=NRW/L=BOT/O=STT/OU=WEB/CN=localhost/emailAddress=local@example.com Getting Private key 1 Datei(en) verschoben. 1 Datei(en) verschoben. ----- Das Zertifikat wurde erstellt. Drücken Sie eine beliebige Taste . . .
Nun ist unser Zertifikat erstellt und dieser Schritt ist abgeschlossen.
Das fertige Zertifikat besteht aus zwei Teilen, die in zwei verschiedenen Dateien gespeichert sind: dem Private Key mit der Dateiendung KEY sowie der signierten öffentlichen Zertifikatsdatei mit der Dateiendung CRT. Beide Dateien findet ihr im Ordner C:\xampp\apache\conf\ in den Unterordnern "ssl.crt" sowie "ssl.key" unter den Namen "server.crt" (Signed Certificate) sowie "server.key" (Private Key), sofern ihr XAMPP in C:\xampp installiert habt.
Wenn ihr mehrere Zertifikate für unterschiedliche Domains erstellen möchtet, solltet ihr darauf achten, diese Dateien vorher umzubenennen oder in einen anderen Unterordner zu verschieben, da sie sonst mit Erstellung des nächsten Zertifikats überschrieben werden würden.
Die Gültigkeit des erstellten Zertifikats beträgt übrigens per Default 365 Tage. Wenn ihr einen anderen Zeitraum präferiert, könnt ihr die Datei makecert.bat mit einem Texteditor öffnen und den Parameter "-days 365" entsprechend anpassen.
VirtualHost definieren
Im nächsten Schritt müssen wir für jede unserer Domains, die wir über HTTPS aufrufbar machen möchten, einen neuen VirtualHost in der Datei C:\xampp\apache\conf\extra\httpd-vhosts.conf einrichten, ähnlich wie wir es auch schon in dem ersten Tutorial gemacht haben.
An dieser Stelle ist es wichtig zu wissen, dass HTTP über Port 80 läuft, jedoch SSL dagegen über Port 443. Im folgenden definieren wir die URL example.com, die sowohl über http://www.example.com als auch über https://www.example.com erreichbar sein soll. Der erste Block <VirtualHost *:80> gilt für alle Anfragen über Port 80 (also für alle Anfragen beginnend mit http://...) und sieht in etwa so aus, wie die Blöcke aus dem ersten Tutorial. Unter DocumentRoot können wir wieder das Stammverzeichnis der jeweiligen Website angeben.
# HTTP <VirtualHost *:80> DocumentRoot "C:/xampp/htdocs/myproject" ServerName example.com ServerAlias www.example.com </VirtualHost> # HTTPS <VirtualHost *:443> DocumentRoot "C:/xampp/htdocs/myproject" ServerName example.com ServerAlias www.example.com SSLEngine on SSLCertificateFile "conf/ssl.crt/server.crt" SSLCertificateKeyFile "conf/ssl.key/server.key" </VirtualHost>
Die HTTPS-Anfragen werden über den zweiten Block "<VirtualHost *:443>" definiert (Port 443). Die Angaben zum DocumentRoot-Verzeichnis, ServerName und ServerAlias sind identisch zu HTTP. Zusätzlich müssen wir nun aber noch SSL einschalten und Angaben zu unserem SSL-Zertifikat und Key machen. Damit sagen wir dem Server, dass er SSL nutzen soll (SSLEngine on) und wo er die entsprechenden Dateien (CRT und KEY) findet. Wie man sieht, verwenden wir hier die Ordner, in denen gerade unser Zertifikat gespeichert wurde.
In dem Beispiel hier haben wir nur eine URL definiert, die sowohl über HTTP als auch über HTTPS erreichbar sein soll. Jede weitere Domain beziehungsweise URL muss genauso definiert werden, wir können beliebig viele Blöcke dieser Art untereinander schreiben.
Das Beispiel enthält sowohl für die Zertifikatsdatei (CRT) als auch für den privaten Schlüssel (KEY) den Pfad, unter dem die beiden Dateien standardmäßig nach deren Erstellung gespeichert werden. Wenn ihr mehrere Zertifikate für unterschiedliche Domains erstellt habt und nicht das gleiche Zertifikat für diese verschiedenen Domains nutzen möchtet, müsst ihr hier entsprechend die Pfade und Dateinamen anpassen, je nachdem wo ihr euer Zertifikat gespeichert habt.
Apache neu starten
Damit unsere Änderungen aktiv werden, müssen wir jetzt - natürlich erst nach Speicherung der geänderten Datei - Apache neu starten. Dafür öffnen wir das XAMPP Control Panel und klicken hinter dem Modul "Apache" auf "Stop" und anschließend wieder auf "Start", damit der Server neu mit der neuen Konfiguration startet.
Ausnahmen hinzufügen
Nun sind wir mit unserer Konfiguration fertig. Wenn wir jedoch eine unserer frisch definierten HTTPS-Seiten im Browser aufrufen, erhalten wir unter Umständen (je nach Browser und Browsereinstellungen) die Fehlermeldung "Diese Verbindung ist nicht sicher" mit dem Fehlercode SEC_ERROR_UNKNOWN_ISSUER. Dazu liefert uns zum Beispiel der Firefox-Browser den abschreckenden Text "Der Inhaber von ... hat die Website nicht richtig konfiguriert. Firefox hat keine Verbindung mit der Website aufgebaut, um ihre Informationen vor Diebstahl zu stützen". Kurz gesagt: Wir können unsere Website trotz erfolgreicher Konfiguration gar nicht aufrufen.
Der Grund dafür ist, dass wir das Zertifikat selbst erstellt haben und Firefox, Chrome, Edge und andere Browser von sich aus nur Zertifikaten von offiziellen Zertifizierungsstellen trauen. Für unsere lokalen Testzwecke wäre das natürlich übertrieben, weswegen wir getrost auf den Button "Ausnahme hinzufügen..." klicken können. In dem sich nun öffnenden Dialog sollten wir die Option "Diese Ausnahme dauerhaft speichern" aktivieren, sonst werden wir bei jedem Aufruf der Seite erneut gefragt. Anschließend können wir auf "Sicherheits-Ausnahmeregel bestätigen" klicken und sollten von nun an unsere Website über die HTTPS-URL sehen können.
Zertifikat installieren
Alternativ zum Hinzufügen einer Ausnahme im Browser, wie wir es uns im letzten Abschnitt angesehen haben, können wir unser eigenes Zertifikat auch unabhängig vom Browser direkt auf unserem System installieren. Dazu öffnen wir einfach unsere Zertifikatsdatei "server.crt" aus dem Ordner "C:\xampp\apache\conf\ssl.crt" mit einem Doppelklick und klicken im sich öffnenden Dialog auf "Zertifikat installieren". Daraufhin öffnet sich der "Zertifikatimport-Assistent" von Windows, den wir folgendermaßen durchlaufen:
- Wir überspringen die Willkommensseite mit einem Klick auf "Weiter".
- Auf der Seite "Zertifikatsspeicher" wählen wir die Option "Alle Zertifikate in folgendem Speicher speichern" und klicken auf "Durchsuchen".
- Voreingestellt ist hier der Zertifikatsspeicher "Eigene Zertifikate". Wir wählen stattdessen "Vertrauenswürdige Stammzertifizierungsstellen" (Trusted Root Certification Authorities) und bestätigen mit "OK".
- Nun klicken wir abermals auf "Weiter" und gelangen zu einer Zusammenfassung unseres Imports. Diese bestätigen wir mit einem Klick auf "Fertig stellen" und bestätigen anschließend die unter Umständen angezeigte Warnmeldung, um die Installation abzuschließen.
Dies sollte dafür ausreichen, in den Browsern Chrome und Edge ein grünes Schloss zu erhalten. Sollte der Browser während der Zertifikatsinstallation geöffnet gewesen sein, muss er, bevor wir das grüne Schloss sehen, vorher einmal neu gestartet werden, damit unser Zertifikat beim Starten des Browsers aktualisiert geladen wird.
Um unser eigenes Zertifikat auch vom Firefox-Browser anerkennen zu lassen, ist noch einer der beiden folgenden zusätzlichen Schritte notwendig:
- Am einfachsten ist es, in die Adresszeile von Firefox "about:config" einzugeben und anschließend die Option "security.enterprise_roots.enabled" auf "true" zu setzen. Damit erkennt auch Firefox die Trusted Root Certification Authorities von Windows an (wie die beiden anderen Browser es standardmäßig tun).
- Alternativ können wir in die URL-Leiste auch "about:preferences" eingeben und anschließend die Suchfunktion oben rechts nutzen, um nach "Zertifikaten" zu suchen. Danach klicken wir auf "Zertifikat anzeigen" ("View Certificates") und im Dialogfenster auf "Importieren", wo wir unser eigenes Zertifikat auswählen und den Vorgang anschließend bestätigen.
Damit solltet ihr auch im Firefox ein grünes Schloss erhalten.
Sicherheitshinweis
Die in diesem Tutorial gezeigte Anleitung zur Installation und Nutzung selbst erstellter SSL-Zertifikate sollte nur für Testzwecke verwendet werden, zum Beispiel wenn ihr einen XAMPP-Server innerhalb einer virtuellen Maschine ohne Internetverbindung nutzt, um eure Internetseiten zu testen, bevor sie online gehen.
Für den Produktiveinsatz sollten dagegen nur Zertifikate einer anerkannten Zertifizierungsstelle (Certification Authority, CA) genutzt und installiert werden.
Über den Autor
Software von Stefan Trost finden Sie auf sttmedia.de. Benötigen Sie eine individuelle Software nach Ihren eigenen Wünschen? Schreiben Sie uns: sttmedia.de/kontakt
Profil anzeigen
Ähnliche Themen
Virtuelle Domains für Apache/XAMPP erstellen
Tutorial | 0 Kommentare
XAMPP: Aufruf über HTTPS führt zu Error 403 (Access Forbidden)
Frage | 1 Antwort
MySQL: CSV Export als auf dem Server gespeicherte Datei
Tutorial | 0 Kommentare
Delphi: Pfad einer Bibliothek oder Unit für alle Projekte hinzufügen
Frage | 1 Antwort
XAMPP: Datei makecert bearbeiten
Frage | 9 Antworten
Alle HTTP-Anfragen auf HTTPS umleiten
Frage | 2 Antworten
Bestimmte IP Adressen mit HTACCESS blockieren
Tipp | 0 Kommentare
Wichtiger Hinweis
Bitte beachten Sie: Die Beiträge auf askingbox.de sind Beiträge von Nutzern und sollen keine professionelle Beratung ersetzen. Sie werden nicht von Unabhängigen geprüft und spiegeln nicht zwingend die Meinung von askingbox.de wieder. Mehr erfahren.
Jetzt mitmachen
Stellen Sie Ihre eigene Frage oder schreiben Sie Ihren eigenen Artikel auf askingbox.de. So gehts.
Es wäre nett zu wissen, in WELCHER DATEI der Virtuellhost eingefügt werden muss ...
10.06.2018 um 22:31
Dieses Tutorial baut auf das erste Tutorial zu diesem Thema auf, entsprechend ist es auch die gleiche Datei, die hier bearbeitet wird:
C:\xampp\apache\conf\extra\httpd-vhosts.conf
Ich habe den Dateipfad jetzt auch hier nochmal in diesem Tutorial eingefügt, ich hoffe damit wird es etwas klarer.
10.06.2018 um 23:31
Problem: XAMPP (apache) lässt sich nach der Änderung nicht mehr starten, da der SSL Block des VHosts in eine andere datai eingetragen werden muss ... musste eine Weile suchen. Die Datei ist im selben Verzeichnis und hat ssl im Namen.
Hab es mit der aktuellen xampp 7.3.x version getestet. Google Chrome spuckt immer rum (Verbindung sei nicht sicher) ... Ausnahme geht da wohl nicht ...
19.06.2018 um 18:16
Also ich habe alle Blöcke in der gleichen Datei, das geht ohne Probleme. Vielleicht liegt es an der Version dass sich da etwas geändert hat?! Oder du hast einen anderen Fehler gemacht?
Das mit der nicht sicheren Verbindung ist klar. Wenn du selber ein Zertifikat erstellst wird diesem Zertifikat natürlich erstmal nicht vertraut. Das heißt du musst dein eigenes Zertifikat als vertraulich einstufen (gibt dazu Tutorials im Netz) oder einfach eine Ausnahme hinzufügen. Im Firefox ist das einfach, Chrome zickt da gerne etwas herum.
19.06.2018 um 21:25
Müssen die Angaben aus Teil 2 des Tutorials zusätzlich zu den Angaben aus Part 1 in die httpd-vhosts.conf eingefügt werden, so dass die httpd-vhosts.conf demnach wie folgt aussähe:
Oder sind allein die in diesem Tutorial beschriebenen Blöcke ausreichend?
20.01.2020 um 06:42
Nein, nicht zusätzlich.
Den ersten Abschnitt brauchst du nicht, es reicht das was du unter #HTTP und #HTTPS definiert hast.
Wobei du in deinem Beispiel bei der HTTP-Variante eine Umleitung zu HTTPS einbauen solltest, damit die Seite auch immer nur über HTTPS erreichbar ist und Leute die http.. eingeben zu https.. umgeleitet werden.
20.01.2020 um 15:35
Hallo Stefan!
Ich habe Deine Anleitung befolgt erhalte aber im Ergebnis vom Firefox den Fehlercode "SSL_ERROR_RX_RECORD_TOO_LONG" ausgegeben. Bei diesem Fehler besteht auch nicht die Möglichkeit eine Ausnahmeregel zu definieren.
Den gleichen Fehler habe ich übrigens zuvor auch schon erhalten, als ich es mit Zertifikatsdateien versucht habe, die ich mit dem Client für Letsencrypt erstellt hatte. Ich hatte die Hoffnung, dass es mit Deiner Anleitung klappt.
Hast Du vielleicht eine Idee woran es liegen könnte?
Hier noch ein paar Infos zu den Rahmenbedingungen. Hilft vielleicht Rückfragen zu vermeiden.
Ich nutze schon seit einiger Zeit einen aktuellen XAMPP auf meinem lokalen PC. Für jedes Projekt habe ich einen virtuellen Host definiert.
Der Hostname auf dem lokalen System lautet "local.#meine-domain#.de". Über die hosts-Datei von Windows sorge ich dafür, dass ein Zugriff auf diese Domain auf meinen eigenen Rechner umgeleitet wird.
Der Zugriff auf den Hostname via HTTP funktioniert einwandfrei.
Auf dem Live-System habe ich mal folgenden Test durchgeführt:
Ich habe die Sub-Domain "local.#meine-domain#.de" angelegt, einen entsprechenden virtuellen Host definiert und mit Letsencrypt ein Zertifikat erstellt und eingebunden. Die Domain ist via HTTP und via HTTPS über das Internet erreichbar. Sie lässt sich von meinem lokalen PC aber auch vom Server selbst aus aufrufen.
Anschließend habe ich in der Windows hosts-Datei die Zeile
127.0.0.1 local.#meine-domain#.de
hinzugefügt und anschließend erneut versucht die Seite vom Server aus zu laden.
Ergebis: Fehlanzeige!
Ich erhalte wieder den oben genannten Fehlercode.
Ich bin mit meinem Latein am Ende und hoffe Du hast einen guten Tipp für mich :-(
Viele Grüße!
Bill
18.03.2020 um 21:44
Ich hatte diesen Fehler auch noch nie, laut einer kurzen Internetrecherche kann der Fehler aber scheinbar entweder daher stammen, dass die Ports auf dem Server falsch konfiguriert sind (Port 443 sollte es sein) oder die verwendeten SSL/TLS-Bibliotheken upgedatet werden müssen. Ich würde mal in diese Richtung weiter probieren...
19.03.2020 um 19:53