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.
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 ( https://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
[…] spricht. Dazu generieren wir uns schnell ein selbst signiertes Zertifikat. Natürlich kann auch ein richtiges Zertifikat genutzt werden, dazu benötigt man nur den Certificate Signing Request (CSR) und schickt diesen zum […]
Client-Zertifikate als sicherer Login-Ersatz? | PHP Gangsta - Der PHP Blog mit Praxisbezug
6 Jun 12 at 00:26
Wie viel Zeit braucht eigentlich ein Provider um SSL einzurichten?
Bei mir geht im Moment nichts ausser ftp und dies seit 24 Stunden.
Peter
26 Okt 12 at 12:52
Bei mir funktioniert das ganze nicht so, wie es sollte. Der Port an sich funktioniert. Aber, wenn ich dann direkt via https auf die Seite zugreifen will, kommt immer folgende Meldung:
„Fehler 107 (net::ERR_SSL_PROTOCOL_ERROR): SSL-Protokollfehler“
Silvio Kennecke
31 Mrz 13 at 20:30
finde ich gut
raymond1234
30 Jul 13 at 00:55
Guter Beitrag..
michibck
11 Nov 14 at 14:26
Fehler: Gesicherte Verbindung fehlgeschlagen
Die Verbindung zu http://www.phpgangsta.de wurde unterbrochen, während die Seite geladen wurde.
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.
Weitere Informationen…
Fehler an Mozilla melden, um beim Identifizieren und Blockieren böswilliger Websites zu helfen
Sauron
25 Mrz 16 at 00:03
Hallo hoffe einer liest das noch hab alles wie angegeben umgesetzt aber jetzt lässt sich keine seite öffnen. Error .log vom apache2 besagt:
[Thu Jun 30 07:47:04.965772 2016] [ssl:warn] [pid 14476] AH01906: xxxx.de:8080:0 server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)
[Thu Jun 30 07:47:04.965823 2016] [ssl:warn] [pid 14476] AH01909: xxxx.de:8080:0 server certificate does NOT include an ID which matches the server name
conf datei:
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3
SSLCipherSuite ALL:!DH:!EXPORT:!RC4:+HIGH:+MEDIUM:!LOW:!aNULL:!eNULL
SSLCertificateFile /etc/ssl/certs/2_bad-timing.eu.crt
SSLCertificateKeyFile /etc/ssl/private/bad-timing.key
SSLCertificateChainFile /etc/ssl/certs/1_root_bundle.crt
Lucky
30 Jun 16 at 07:56