PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Kostenloses SSL-Zertifikat holen und einrichten

with 19 comments

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.

Written by Michael Kliewe

März 1st, 2010 at 10:58 am

19 Responses to 'Kostenloses SSL-Zertifikat holen und einrichten'

Subscribe to comments with RSS or TrackBack to 'Kostenloses SSL-Zertifikat holen und einrichten'.

  1. 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

  2. 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

  3. 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

  4. 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

  5. Gehört das wirklich mit in den Quellcode? 🙂

    Roman

    1 Mrz 10 at 17:14

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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 )…

  11. […] Kostenloses SSL-Zertifikat holen und einrichten. […]

  12. 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

  13. […] 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 […]

  14. 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

  15. 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

  16. finde ich gut

    raymond1234

    30 Jul 13 at 00:55

  17. Guter Beitrag..

    michibck

    11 Nov 14 at 14:26

  18. 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

  19. 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

Leave a Reply

You can add images to your comment by clicking here.