Kostenloses SSL-Zertifikat holen und einrichten
Ab heute ist phpgangsta.de auch über https erreichbar. Wer also sicher gehen möchte dass er auch auf dem richtigen Server landet und keinen “Mann in der Mitte” zuhören kann ab jetzt auch https://www.phpgangsta.de besuchen.
Warum hat das eigentlich nicht jeder? Gäbe es keine Nachteile wäre das wohl so, aber normalerweise kosten SSL-Zertifikate Geld, viel Geld, je nachdem wieviele Funktionen das Zertifikat erfüllen soll. Es ist zwar auch möglich, sich selbst Zertifikate zu erstellen, dann bekommt der Benutzer jedoch eine Fehlermeldung zu dem selbst signierten Zertifikat, und das möchte man eigentlich seinen Usern nicht zumuten.
Es gibt aber auch kostenlose, von einer Certified Authority (CA) signierte Zertifikate, und genau solch eins habe ich hier nun installiert. Wie man ein solches Zertifikat von StartSSL bekommt könnt ihr im Heise-Artikel “SSL für lau” nachlesen. Es gibt natürlich auch noch weitere Anbieter, zB CaCert.
Danach haben wir also 3 Dateien:
- Ein Zertifikat für die Domain (hier phpgangsta.de.crt)
- Eine Datei mit dem privaten Key(hier phpgangsta.de.key)
- Ein sogenanntes Intermediate Zertifikat, auch Chain-Certificate oder Kettenzertifikat genannt (hier sub.class1.server.ca.pem)
Nachdem man ein solches Zertifikat erhalten hat, muss man es noch im Webserver installieren. Ich gebe hier 2 Anleitungen, einmal für den Apache2 und einmal für nginx.
Der Apache2 benötigt zuerst einmal SSL-Support, dazu sollte man das entsprechende Modul installieren:
sudo a2enmod ssl
Dann benötigen wir einen zusätzlichen VirtualHost, der die SSL-Verbindungen entgegennimmt. Darin definieren wir auch die Pfade zu den Zertifikaten:
<VirtualHost 85.214.28.26:443> ServerName phpgangsta.de ServerAlias www.phpgangsta.de php-gangsta.de www.php-gangsta.de ServerAdmin username@gmx.de DocumentRoot "/path/to/phpgangsta/wordpres/" SSLEngine On SSLCertificateFile /etc/apache2/ssl/phpgangsta.de.crt SSLCertificateKeyFile /etc/apache2/ssl/phpgangsta.de.key SSLCertificateChainFile /etc/apache2/ssl/sub.class1.server.ca.pem <hier noch viele Anweisungen zum Logging, safe-mode, open_basedir, deflate, expires usw.> </VirtualHost>
Nach dem Ändern der Apache-Konfigration benötigen wir natürlich noch einen Restart des Dienstes:
sudo /etc/init.d/apache2 configtest sudo /etc/init.d/apache2 stop sudo /etc/init.d/apache2 start
Danach sollte die Domain auch verschlüsselt zur Verfügung stehen.
Im nginx geht es ähnlich einfach:
Um SSL nutzen zu können muss nginx mit dem configure-Parameter –with-http_ssl_module kompiliert sein. Dann fügt man einen weiteren VHost hinzu, ähnlich wie im Apache:
server {
listen 443 ssl;
server_name www.phpgangsta.de php-gangsta.de www.php-gangsta.de;
ssl_certificate /etc/apache2/ssl/phpgangsta.de.crt;
ssl_certificate_key /etc/apache2/ssl/phpgangsta.de.key;
ssl_session_timeout 5m;
ssl_protocols SSLv3;
ssl_ciphers HIGH:!ADH:!MD5;
ssl_prefer_server_ciphers on;
keepalive_timeout 70;
location / {
proxy_pass http://backendwebserverupstream;
}
}
Wie man sieht ist das hier ein Reverse-Proxy-VHost, der die SSL-Verbindung terminieren soll. Auch fällt auf, dass man hier nur 2 Angaben machen muss, es fehlt das Intermediate-Certificate. Das muß man beim nginx an das Domain-Zertifikat anhängen:
cat /etc/apache2/ssl/sub.class1.server.ca.pem >> phpgangsta.de.crt
Dann noch den nginx neustarten und alles ist wunderbar:
sudo /etc/init.d/nginx configtest sudo /etc/init.d/nginx restart
Bei der Recherche zu nginx (ich habe mal das Mail-Proxy-Modul ausprobiert, funktioniert super auf den ersten Blick!) bin ich über diese Seite bei Calomel gestossen, die ich unbedingt weiterempfehlen möchte, eine schöne umfangreiche Seite die noch einige Informationen bereithält, die das nginx-Wiki nicht bietet.
Ein Problem gab es bei WordPress allerdings noch: Wenn man die Seite über https aufgerufen hat, waren die Links darin noch http://… Das konnte ich jedoch relativ einfach durch das Addon HTTPS for WordPress lösen, dann werden die Links alle korrigiert. Hätten WordPress und die ganzen Addons diese “absoluten URLS” nicht benutzt hätte es das Problem auch nicht gegeben.
Keine ähnlichen Artikel.



Du kannst noch erwähnen, dass die server load steigt. Schließlich wird alles, was übertragen wird, verschlüsselt und das wird bei vielbesuchten Seiten den ein oder anderen zusätzlichen Server kosten.
Wenn man auf die Performance schauen muss, dann sollte man die SSL-Verbindungen nach dem Motto “sowenig wie möglich, soviel wie notig” einsetzen.
Die Gratis-Zertifikate schau ich mir mal an
Grüße
Norbert
1 Mrz 10 at 12:04
Hast du da verlässliche Zahlen ab wievielen Verbindungen das wirklich auffällt? Das müssen schon einige tausend sein, siehe
http://www.o3magazine.com/4/a/0/2.html
Michael Kliewe
1 Mrz 10 at 12:28
Habe ich leider nicht; aber ganz unbedeutend ist es wohl nicht, sonst wäre diese Info nicht im Apache Manual zu finden:
http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html#aboutssl
Aber da du deine Seite umgestellt hast … mach doch einfach einen Test.
Norbert
1 Mrz 10 at 12:50
SSL auf dem Server einrichten ist meist der einfache Teil, aber die Projekteinbindung, besonders im nach hinein, kann aufwändiger werden. So müssen zum Beispiel alle eingebundenen Objekte (Bilder/CSS/Js) auch SSL verschlüsselt sein damit der IE nicht diese sch*** Warnbox ausgibt. Richtig spaßig wird es wenn man Contentserver mit unterschiedlichen Domainnamen benutzt.
kostaki
1 Mrz 10 at 14:43
Gehört das wirklich mit in den Quellcode?
Roman
1 Mrz 10 at 17:14
Deine Aussage verstehe ich nicht Roman, kannst du mich aufklären? Was gehört deiner Meinung nach nicht mit in den Quellcode?
Michael Kliewe
1 Mrz 10 at 18:32
Ich denke das “kann aufwändiger werden. So müssen zum Beispiel alle eingebundenen Objekte (Bilder/CSS/Js) auch SSL verschlüsselt sein damit der IE nicht diese sch*** Warnbox ausgibt.” ist gemeint. Ich würde auch meinen das der überwiegende Teil schlicht relativ eingebunden wird. Und somit das Problem nicht auftritt. HTTP || HTTPS gehört also nicht in den Quellcode.
Ben Rexin
1 Mrz 10 at 19:46
Natürlich gehört es nicht in den Code, aber ruft doch zum Beispiel mal diese Seite per https auf und guck euch den Quellcode an. Dort sind mehrere Objekte noch per per http verlinkt und deshalb gibt der IE ne Warnung aus (Firefox macht es etwas gesitteter). Außerdem lässt es sich nicht vermeiden die gesamte URL anzugeben wenn man Content auslagern möchte.
kostaki
1 Mrz 10 at 20:40
Ja, bei anderen Domains (CDN-Domains oder Subdomains) für statische Dateien ist es etwas aufwändiger, da muss man schon etwas tricksen in der Applikation.
Noch komplizierter wird es wenn man dann auch noch einen extra ReverseProxy zum SSL-Offloading davorschaltet (siehe das nginx-Beispiel oben), dann sieht der Applikationsserver immer nur nicht-verschlüsselte Verbindungen vom Proxy.
Da müßte man dann glaub ich entweder einen speziellen Header mitsenden zum Applikationsserver wenn die Clientverbindung verschlüsselt ist, oder der Proxy parst den HTML-Code nach Links und ersetzt die entsprechenden URLs durch verschlüsselte Links. (Stichwort ProxyHTMLURLMap)
In nginx wäre das zB:
proxy_set_header X-Forwarded-Protocol https;
Hier gibts gute Infos dazu:
http://www.apachetutor.org/admin/reverseproxies
http://yuji.wordpress.com/2008/08/15/django-nginx-making-ssl-work-on-django-behind-a-reverse-proxy/
Michael Kliewe
1 Mrz 10 at 22:08
Social comments and analytics for this post…
This post was mentioned on Twitter by PHPGangsta: Neuer Blogartikel: Kostenloses SSL-Zertifikat holen und einrichten ( http://www.phpgangsta.de/1042 )…
uberVU - social comments
1 Mrz 10 at 23:25
[...] Kostenloses SSL-Zertifikat holen und einrichten. [...]
Linkhub – Woche 09-2010 « pehbehbeh
7 Mrz 10 at 17:48
Ich habe seit kurzer Zeit einen Internetshop in Betrieb genommen. So langsam läuft der Shop an und die ersten Konsumenten kaufen ein.
Bis jetzt habe ich mir jedoch noch keine Gedanken um die Sicherheit der Daten von meinen Kunden gemacht. Bei einem Bekannten der auch einen Onlineshop besitzt gab es schon Probleme aufgrund dessen hat er sich eine Massen Verifikation installieren lassen.
Was meint ihr ab wann lohnt es sich so ein Zertifikat zu erwerben und einzusetzen ??
Milton Mancherian
11 Okt 11 at 12:03