Welche Unterschiede und Möglichkeiten es gibt, den eigenen Server bzw. die eigene Webseite mit einer sicheren SSL Verbindung auszustatten und wie die Einrichtung und Konfiguration (unter Apache2 und nginx) dafür verläuft, wird im folgenden Artikel thematisiert.
Hintergrund:
SSL (auch Secure Sockets Layer genannt) bietet die Möglichkeit, Daten sicher vom Client zum Server zu übermitteln. Durch eine Verschlüsselung (meistens RSA oder AES) kann der Client und der Server über ein gemeinsames Protokoll miteinander kommunizieren, ohne dass Dritte die gesendeten Informationen mitschneiden und auswerten können (siehe auch MITM). Gerade bei öffentlichen Netzwerken sollte man beim Login umbedingt auf eine solche sichere Verbindung achten. Diese ist im Regelfall über die Adresszeile des Browsers erkennbar.
Das kommerzielle SSL:
Vergleiche zu den Anbietern finden sich im Internet genug, wie u.a. auf sslrenewals.com. Die Ausstellung eines Zerifikats funktioniert allerdings fast überall auf die gleiche Art und Weise. Wir generieren uns zu allererst ein öffentlichen und einen privaten Schlüssel, welche unsere sichere SSL-Verbindung nach dem Public-Key-Verfahren realisieren soll. Es bietet sich unter Linux openssl dafür an. Beachtet: Der Common Name CN (eg, YOUR name) ist der Name, für den das Zertifikat erstellt und signiert wird. Bei einer Website ist es der FQDN des VirtualHosts.
[php]
# Neuer Key mit 2048Bit Länge
openssl genrsa -out domain.tld.key 2048
# Neuen CSR erstellen
openssl req -new -key domain.tld.key -out domain.tld.csr
[/php]
In der Datei domain.tld.key finden sich dann unsere beiden Schlüssel. In der CSR-Datei (Ceritificate Signing Request) finden sich üblicherweise Informationen zum Inhaber, die Adresse des Servers, für welchen das Zertifikat ausgestellt werden soll, sowie den öffentlichen Schlüssel. Nachdem man den CSR zur CA (Certificate Authority) übermittelt hat, wird – sofern man die Vorrausetzungen erfüllt – ein Zertifikat (CRT) ausgestellt. Dieses beinhaltet Informationen zum Inhaber, den öffentlichen Schlüssel sowie eine digitale Signatur des Ausstellers. Anschließend folgt das Einbinden des Zertifikats.
Das selbstzertifizierte SSL:
Kostenlos geht es natürlich auch – jedoch mit einem massiven Nachteil. Da keine geprüfte CA unsere Schlüssel signiert sondern wir diesen Schritt selbst erledigen, erhalten wir in den meisten Webbrowsern einen Hinweis, dass das verwendete Zertifikat nicht vertrauenswürdig ist und die Verbindung möglicherweise unsicher sei. Das schreckt natürlich einige User ab, daher empfielt sich im Regelfall ein CA signiertes SSL Zertifikat, welches dann im Browser automatisch akzeptiert wird. Nichtsdestotrotz könnt ihr natürlich selbst entscheiden, welchen Weg ihr wählt.
So erstellt ihr euer Zertifikat selbst:
Wie bei unserem CA zertifiziertem SSL, erstellen wir zu allererst unsere beiden Schlüssel, welche für das Public-Key-Verfahren zwingend notwendig sind. Das ganze funktioniert exakt genauso, wie im obrigen Beispiel.
Der Unterschied: Statt unsere Keys einer CA zu übermitteln, signieren wir diese selbstständig mit den oben genannten Nachteilen. Auch für die Signierung verwenden wir openssl. Der Parameter -days stellt dabei die Tage dar, bevor das Zertifikat abläuft. Mit privatem Schlüssel sowie Zertifikat für unsere Webseite können wir mit dem Einbinden des Zertifikats weitermachen.
[php]
# Key
openssl genrsa -out domain.tld.key 2048
# CSR
openssl req -new -key domain.tld.key -out domain.tld.csr
# CRT
openssl x509 -req -days 365 -in domain.tld.csr -signkey domain.tld.key -out domain.tld.crt
[/php]
Zertifikat einbinden:
Egal welchen Weg wir gewählt haben: Wir haben unser Zertifikat (.crt) sowie das Keyfile (.key) – wir können also unsere SSL-Verbindung implementieren. Unter gewissen Umständen enthält man zusätzlich ein Intermediate-Zertifikat (CA-Zertifikat) mitgeliefert, welches dann ebenfalls in den VirtualHost eingebunden werden muss. Sowohl domain.tld.crt (Zertifikat mit öffentlichen Schlüssel) als auch die domain.tld.key (privater Schlüssel) und ggf. CA-Zertifikat (intermediate.crt) legt man in die passenden Verzeichnisse für die jeweilige Serverkonfiguration ab. Es bietet sich zur Lagerung ein Unterordner des Webservers an. Bei einem Apache-Webserver wird nun noch ein VirtualHost angelegt, um die Verbindung für HTTPS (Port 443) zu akzeptieren und die Keyfiles einzubinden.
Nicht vergessen: Das Apache Modul für SSL aktivieren.
[php]
# Aktivieren von SSL für Apache
a2enmod ssl
# Der VirtualHost-Eintrag
<VirtualHost ******:443>
ServerName ******
SSLEngine on
SSLCertificateKeyFile /etc/apache2/ssl/domain.tld.key
SSLCertificateFile /etc/apache2/ssl/domain.tld.crt
#SSLCertificateChainFile /etc/apache2/ssl/intermediate.crt
[…]
</VirtualHost>
# Reload der Konfiguration
/etc/init.d/apache2 force-reload
[/php]
Unter einem nginx-Webserver funktioniert das fast ähnlich. Wir müssen hier allerdings beachten, dass das CA-Zertifikat und das SSL-Zertifikat miteinander verbunden werden müssen. Wir hängen also den Inhalt der (in diesem Beispiel genannten) intermediate.crt an den Inhalt der domain.tld.crt an.
Anschließend passen wir wieder unsere Konfiguration an, um SSL zu aktivieren.
[php]
# Zusammenfügen
cat intermediate.crt >> domain.tld.crt
# Konfiguration
server {
listen 443;
ssl on;
ssl_certificate /etc/nginx/ssl/domain.tld.crt;
ssl_certificate_key /etc/nginx/ssl/domain.tld.key;
server_name domain.tld
[…]
}
# Restart
/etc/init.d/nginx restart
[/php]
Troubleshooting:
Sollte es Probleme geben, hilft vielleicht ein Blick bei Digicert.com. Diese bieten einen SSL Check an, welcher prüft ob alles seine Richtigkeit hat. Ansonsten kann man das natürlich auch über den Server laufen lassen, indem man openssl s_client -connect domain.tld aufruft.
EV SSL:
Eine besondere Form des SSL-Zertifikats stellt das Extended SSL dar. Diese EV-Zertifikate unterliegen einer strengen Eigentümerprüfung um höchstmögliche Sicherheit zu gewährleisten. Durch diesen Mehraufwand kosten EV-SSL Zertifikate mit durchschnittlich 250-350€/Jahr mehr als andere Zertifikate, bieten jedoch auch einen besonderen Vorteil: Fast jeder moderne Browser hebt ein EV-SSL Zertifikat in der Adressleiste optisch hervor (grüne Leiste), wodurch der Besucher direkt den Eindruck einer sicheren und vertrauenswürdigen Seite erhält.
© 2008 ¥akuza112 Inc.