HTTPS für die eigene Webseite

tas2580  

Normalerweise geht die komplette Kommunikation mit Webseiten in Klartext übers Netz und kann so von jedem der mit in der Leitung hängt abgehört werden. Solange man nur Content liest ist das nicht weiter schlimm, sobald aber Login-Daten oder Bankdaten übertragen werden sollte man darauf achten das der Datentransfer verschlüsselt stattfindet. Banken und auch die meisten Onlineshops bieten mittlerweile HTTPS an, viele Blogs oder Foren tun das aber nicht, so können die Logindaten recht einfach mitgelesen werden. Außerdem wird mit HTTPS sichergestellt das der Server auch wirklich der ist für den er sich ausgibt. Damit man seine Webseite unter HTTPS anbieten kann benötigt man ein SSL-Zertifikat von einer anerkannten Zertifizierungsstelle. Man kann sich zwar auch selber ein SSL-Zertifikat erzeugen das dann aber im Browser zu einer Warnmeldung führt und Besucher eher abschreckt. Mit einem eigenen Zertifikat ist zwar die Datenübertragung verschlüsselt, es wird aber nicht sichergestellt das der Server auch wirklich der ist der er vorgibt zu sein. Das Problem ist das die Zertifizierungsstellen meistens recht hohe Gebühren für ihre Zertifikate verlangen, so übersteigen die Kosten für das Zertifikat schnell die Kosten für Webspace und Domain. In letzter Zeit hat sich da aber einiges geändert und mittlerweile ist es auch möglich ein Zertifikat das von fast allen Browsern akzeptiert wird kostenlos zu bekommen,

Zertifikat-Anfrage erstellen

Damit man sich ein Zertifikat ausstellen lassen kann benötigt man ein CSR (Certificate Signing Request) das man beim Aussteller des Zertifikats einreicht. So ein CSR kann man auf Linux Rechnern recht einfach mit openssl erstellen, der Befehl dafür lautet:

openssl req -nodes -new -newkey rsa:2048 -out csr.pem -sha256

Dabei werden einige Daten abgefragt, hier sollte man auf jeden Fall richtige Angaben machen. Besonders wichtig das die Domain richtig angegeben wird da der Browser eine Fehlermeldung ausgibt wenn die aufgerufene Domain nicht mit der Domain im Zertifikat übereinstimmt.

Country Name (2 letter code) [AU]: DE
State or Province Name (full name) [Some-State]: Germany
Locality Name (eg, city) []: Stuttgart
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Unternehmen GmbH
Organizational Unit Name (eg, section) []: 
Common Name (eg, YOUR name) []: domain.tld
Email Address []: webmaster@example.com

Zusätzlich kann noch ein Passwort für das Zertifikat angegeben werden, das Passwort muss dann aber immer beim starten des Webservers eingegeben werden. So wird sichergestellt das jemand der das Zertifikat klaut damit nichts anfängt wenn er das Passwort nicht kennt, man kann dann aber den Webserver nicht mehr einfach automatisch beim Systemstart starten lassen.

Wenn man alle Angaben gemacht hat werden 2 Dateien erstellt, einmal eine privkey.pem die den Privaten Schlüssel enthält, und eine csr.pem mit der Zertifikat-Anfrage.

Zertifikat ausstellen lassen

Wenn man sein CSR erfolgreich erstellt hat kann man damit zu einer Zertifizierungsstelle gehen und sich sein Zertifikat ausstellen lassen. Dabei ist es wichtig das man eine Zertifizierungsstelle hat die von den Browsern anerkannt wird da Besucher sonst eine Fehlermeldung bekommen.

Die einzig mir bekannte Stelle die kostenlos Zertifikate ausstellt die von allen gängigen Browsern anerkannt werden ist StartSSL. Dort muss man sich erst mal einen Account anlegen und seine Domain bestätigen. Dazu wird eine E-Mail mit einem Code an webmaster@domain.tld gesendet um zu prüfen ob man berechtigt ist die Domain zu verwalten. Nachdem man seine Domain bestätigt hat kann man dafür ein Zertifikat erstellen, dazu wählt man im Menupunkt Certificates Wizard in dem Dropdown Menu Web Server SSL/TLS Certificate. Den nächsten Schritt kann man überspringen da wir ja schon ein CSR und Private Key haben. Jetzt wird man dazu aufgefordert sein CSR einzufügen. Man öffnet also die csr.pem die man sich auf seinem Server erstellt hat und kopiert den kompletten Inhalt der Datei in das Formularfeld. Nach dem Absenden bekommt man sein Zertifikat angezeigt das man in eine neue Datei mit dem Namen certificate.pem kopiert. Dann öffnet man die privkey.pem die man sich oben mit dem CSR erstellt hat und kopiert den kompletten Inhalt der Datei in die certificate.pem unter das Zertifikat. Die Datei sollte jetzt folgendermaßen aussehen:

-----BEGIN CERTIFICATE-----
xyz
-----END CERTIFICATE-----

-----BEGIN PRIVATE KEY-----
xyz
-----END PRIVATE KEY-----

Wobei statt xyz eine lange Reihe aus Zahlen und Buchstaben stehen muss.

SSL in Lighttpd aktivieren

Damit der Webserver über HTTPS erreichbar ist muss die certificate.pem auf den Webserver kopiert werden, ich kopiere das Zertifikat einfach immer nach /etc/lighttpd/, man kann aber auch einen beliebigen anderen Ort dafür wählen, wichtig ist nur das der Webserver darauf zugreifen kann. Dann muss die /etc/lighttpd/lighttpd.conf noch ein wenig angepasst werden. Dazu fügt man folgendes ein:

$SERVER["socket"] == ":443" {
     ssl.engine         = "enable" 
     ssl.pemfile        = "/etc/lighttpd/certificate.pem"
}

Nachdem man den Webserver neugestartet hat kann man die Webseite über HTTPS aufrufen, der Browser sollte dabei keine Fehlermeldung ausgeben.

HTTPS erzwingen

Die meisten Besucher geben in ihrem Browser einfach nur domain.tld ein, so wird die Webseite weiterhin über HTTP aufgerufen, außerdem ist es unmöglich alle eingehenden Links auf HTTPS abzuändern. Man muss also seine Besucher dazu zwingen HTTPS zu verwenden. Dazu gibt es mehrere Möglichkeiten.

Um im Lighttpd alle Anfragen auf HTTPS umzuleiten kann man in die /etc/lighttpd/lighttpd.conf folgendes einfügen:

$HTTP["scheme"] == "http" {
    $HTTP["host"] =~ ".*" {
        url.redirect = (".*" => "https://%0$0")
    }
}

So werden alle Anfragen die über HTTP kommen auf HTTPS umgeleitet.

Wenn man auf dem Webserver mehrere Webseiten betreibt und nicht für alle Seiten SSL verwendet ist das keine gute Lösung. Man muss also nur für die Seiten die SSL verwenden umleiten, eine Möglichkeit dazu ist die Weiterleitung per PHP zu machen, dafür fügt man in sein Script irgendwo möglichst am Anfang an einer Stelle die von jeder Unterseite ausgeführt wird folgendes ein:

if(!isset($_SERVER['HTTPS']))
{
    
header ('HTTP/1.1 301 Moved Permanently');
    
header ('Location: https://' $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);
}

Das hat allerdings den Nachteil das der erste Aufruf immer noch unverschlüsselt gemacht wird, ein Angreifer könnte also die Weiterleitung unterbinden und seine gefälschte Seite ausliefern. Etwas mehr Sicherheit bietet der HTTP-Header HSTS (HTTP Strict Transport Security). Dabei wird dem Browser beigebracht das die Webseite per HTTPS erreichbar ist und auch nur so aufgerufen werden soll. Wenn der Browser diesen Header einmal empfangen hat wird er in Zukunft die Webseite nur noch über HTTPS aufrufen auch wenn der User nur "domain.tld" in die Adresszeile eingibt. Mit PHP kann man den Header mit folgendem Befehl senden:

header ('Strict-Transport-Security: max-age=31536000');

Die max-age gibt an wie lange (in Sekunden) der Browser die Seite nur per HTTPS aufrufen soll, in dem Beispiel 1 Jahr. Natürlich muss die Seite auch für diese Zeit per HTTPS erreichbar sein da es sonst zu einer Fehlermeldung kommt.


Ähnliche Beiträge


Kommentare


Kommentar schreiben

URLs werden automatisch umgewandelt.
[b]DEIN TEXT[/b] für Fett gedruckt
[quote]DEIN ZITAT[/quote] für Zitate
[code]DEIN CODE[/code] für Code
captcha