[NGINX & StartCOM] SSL Zertifikat beantragen und im Webserver konfigurieren (HTTPS)

  • Hallo,


    in diesem Tutorial möchte ich euch gerne zeigen, wir ihr euch ein kostenloses oder auch kostenpflichtiges, jedoch sehr günstiges SSL Zertifikat für euren Webserver, sprich eure Webseite beantragen und korrekt einrichten könnt. Meiner Meinung nach, sollte das für jedes Webinterface, wo Kunden drauf zugreifen, gemacht werden.


    Inhaltsverzeichnis

    • Ist das Thema für mich interessant?
    • Anbieter für SSL Zertifikate
    • SSL Zertifikat beantragen
    • SSL Zertifikat einrichten
    • Externe SSL Test Webseiten

    Beachtet bitte, dass das Thema SSL immer aktuell gehalten werden muss und es daher mal vorkommen kann, dass dieses Thema nicht ganz perfekt ist. Ich zeige euch das ganze anhand eines Linux Debian Wheezy 7.8 Systems. Der installierte Webserver ist ein nginx 1.6.2 aus den Wheezy Backports. Beim apache Webserver werden natürlich andere Konfigurationen benötigt, da die Syntaxe anders sind!

    Code
    1. $ uname -aLinux web01 3.2.0-4-amd64 #1 SMP Debian 3.2.60-1+deb7u1 x86_64 GNU/Linux$ cat /etc/debian_version7.8$ nginx -vnginx version: nginx/1.6.2$ cat /etc/apt/sources.listdeb http://ftp.de.debian.org/debian/ wheezy maindeb-src http://ftp.de.debian.org/debian/ wheezy maindeb http://security.debian.org/ wheezy/updates maindeb-src http://security.debian.org/ wheezy/updates main# wheezy-updates, previously known as 'volatile'deb http://ftp.de.debian.org/debian/ wheezy-updates maindeb-src http://ftp.de.debian.org/debian/ wheezy-updates main# Backports for nginxdeb http://ftp.de.debian.org/debian/ wheezy-backports maindeb-src http://ftp.de.debian.org/debian/ wheezy-backports main


    1. Ist das Thema für mich interessant?
    Voraussetzung Nummer 1 hierfür ist natürlich, dass du einen Webserver und eine Webseite hast, die über das Internet zugänglich ist. Wenn du sie nur von deinem lokalen Netz aus erreichen kannst, benötigst du nicht zwingend ein SSL Zertifikat, außer es handelt sich zum Beispiel um ein Firmennetz oder ähnliches. Da wäre es dann wieder ratsam.


    Die zweite Voraussetzung ist die, dass man auf der Webseite Daten zum Übermitteln angeben kann, die nicht unbedingt jeder haben sollte. Hierzu zählen zum Beispiel folgende Daten:

    • Personenbezogene Daten, wie Vor- und Nachname, Adresse, Geburtsdatum und -ort
    • Login Daten, wie E-Mail Adresse, Benutzername und Passwort

    Wenn beides auf dich zutrifft, kannst du jetzt entscheiden, ob du deine Webseite und deren Besucher vor fremden Schnüfflern schützen möchtest oder nicht. Von HTTP (ohne SSL Zertifikat) auf HTTPS (mit SSL Zertifikat) gibt es lediglich einen grundlegenden Vorteil bzw. Nutzen: Es verschlüsselt die Verbindung, sodass andere nicht im Klartext die übertragenen Daten mitschneiden können. So kommt z.B. ganz grob und einfach gesagt statt dem Passwort "sehrGeheim" das verschlüsselte Passwort "646c4f71c875dc765f868ec04378ea5a5b16212ea72c8c7e4784b92c5d3d5b82" beim Schnüffler an.


    Ein anderer Vorteil ist, dass ihr damit die Identität eurer Webseite besser festlegt und euch von Fake-Webseiten unterscheidet. Ein weiterer ist, dass anhand der Algorithmen geprüft werden kann, ob die Daten vollständig und unverändert übertragen wurden. Die Webseite Security Server Deutschland erklärt das finde ich sehr schön und sollte euch hierzu auch mehr Auskunft geben. :)


    Zum Schluss werdet ihr ein grünes HTTPS Schloss haben:


    Und SSL Labs wird eure Webseite mit mindestens einem schönen grünen "A" (nach amerikanischen Noten) bewerten, insofern die hier vorliegenden Konfigurationen noch entsprechend aktuell sind:


    Und letztendlich wird auch SSL Shopper eure Installation der Zertifikate als korrekt anmerken:


    2. Anbieter für SSL Zertifikate
    Anbieter für SSL Zertifikate gibt es wie Sand am Meer. Jeder bietet unterschiedliche Zertifikate an, die entsprechend mehr oder weniger kosten. Die einen liefern das Zertifikat auch sehr einfach als ZIP-Datei aus, während man bei anderen relativ mühsam die Dateien einzeln erstellen und downloaden, sowie ggfs. zusammen basteln muss.


    Mein Tipp an euch, wenn ihr Anbieter kennen lernen möchtet: Benutzt Google und gibt mal folgendes ein, wenn ihr...

    Ein paar bekannte und wohl viel (Vermutung) genutzte Anbieter sind die nachfolgenden:

    Wir werden unser Zertifikat in diesem Beispiel bei StartSSL.com (StartCOM) holen, denn dort gibt es kostenlose (1 Jahr gültig) und sehr günstige kostenpflichtige (2 Jahre gültig) Zertifikate, wobei das abhängig von der Class ist. Sobald ein Zertifikat abgelaufen ist, könnt bzw. müsst ihr es natürlich manuell wieder erneuern. Das ist jedoch bei jedem Anbieter normal.


    Neukunden sind automatisch "Class 1" zertifiziert, wodurch jedoch eine gewisse Einschränkung im Gegensatz zu "Class 2" besteht. Dafür sind Class 1 Zertifikate vollständig kostenlos, während Class 2 Zertifikate das zwar auch sind, jedoch die Hochstufung des Accounts entsprechend Bearbeitungsgebühren kostet. Genauere Details könnt ihr der Webseite von StartCOM entnehmen: bzw. [url='http://www.startssl.com/?app=39']StartSSL™ Certificates & Public Key Infrastructure']StartSSL™ Certificates & Public Key Infrastructure


    Beachtet bei der Webseite bitte, dass sie regelmäßige Wartungen am Wochenende durchführen, um die Sicherheit, sowie Services zu optimieren:

    Quote from https://www.startssl.com/

    Some of our services are offline and under maintenance during the night hours on weekends until 7:00 AM GMT in the morning. We apologize for the temporary inconvenience and thank you for your understanding. StartCom Ltd.


    3. SSL Zertifikat beantragen
    Bei Class 1 ist folgendes wichtig, um den Revocation Gebühren in Höhe von 24,90 USD zu entgehen: Überlegt euch im Voraus GENAU, welche Sub-Domains alle für die Domain mit im Zertifikat mit inbegriffen werden sollen. Wenn eine fehlt, müsst ihr das Zertifikat kündigen und dann neu erstellen. Das Kündigen kostet euch dabei die genannten "Revocation Gebühren". Angenommen ihr habt die Domain "example.de", wären folgende Sub-Domains z.B. möglich:

    • www.example.de
    • wiki.example.de
    • support.example.de
    • ts3wi.example.de

    Bei Class 2 dagegen ist es relativ egal, denn da habt ihr die Möglichkeit, ein weiteres Zertifikat mit den selben Sub-Domains einfach erneut anzulegen. Hier muss lediglich der CN (Common Name) des Zertifikats immer anders sein, wodurch es sich durchaus lohnt, diesen mit einem Prefix und numerischen Wert zu setzen - zum Beispiel: ssl0001.example.de. Die Sub-Domains werden nicht als CN, sondern als SAN (Subject Alternative Name) hinterlegt. Das war auch der Grund, warum ich meinen Account auf "Class 2" aufgestuft habe. ;)


    Beantragen tut ihr das Zertifikat dann wie folgt:

    • Nachdem ihr euch einen Account bei StartCOM angelegt habt, loggt ihr euch mit eurem Client Zertifikat ein
      WICHTIG: Keine Trash-Mail/Wegwerf E-Mail benutzen, da ihr darauf alle Bestätigungen etc. erhalten werdet
    • Zunächst müsst ihr die Domain validieren, für die ihr euer Zertifikat erstellen möchtet
      • Validations Wizard
      • "Domain Validation" durchführen
      • Den Schritten des Wizards folgen; zum Schluss solltet ihr die Domain rechts im Menü unter "Domain Validations" mit einem grünen Haken sehen
    • Als nächstes erstellen wir auf unserer Linux Maschine ein CSR (Certificate Signing Request), mit dem wir dann unser CRT (Certificate) beantragen
      • Wir erstellen mit Hilfe von OpenSSL ein 4096 Bit starkes SHA256 CSR inkl. dazugehörigen Key

        Code
        1. openssl req -new -newkey rsa:4096 -nodes -sha256 -out example.de.sha256.csr -keyout example.de.key


      • Die Felder des OpenSSL Wizards füllen
    • Jetzt beantragen wir das CRT (Certificate) mit Hilfe unser neu erstellten CSR bei StartCOM

      • Certificates Wizard
      • "Web Server SSL/TLS Certificate" durchführen
      • Generate Private Key: "Skip", da wir ein eigenes CSR bereits erstellt haben und es deutlich besser ist und schneller geht ;)
      • Vollständigen Inhalt unseres CSR "example.de.sha256.csr" bei StartCOM einfügen
      • Domain wählen, für die ihr das Zertifikat ausstellen/erstellen möchtet: example.de
      • ACHTUNG(!): Die erste Sub-Domain ist die CN! Ansonsten einfach alle benötigten Sub-Domains durch einen Klick auf "Add More" einfügen ;)
      • "Continue", sobald alle gewünschten Sub-Domains aufgenommen wurden, sowie anschließend nochmal überprüfen, ob wirklich alle drin sind
      • "Continue", um das Zertifikat von StartCOM signieren und ausstellen zu lassen
    • Fertig - jetzt dauert es maximal 3 Stunden, bis ihr eine E-Mail erhaltet, dass das Zertifikat zum Download bereit steht. Meistens ist es innerhalb von 15 Minuten bereits fertig. :)

    Zusätzlich benötigen wir noch das Intermediate Server CA (Certification Authority), sowie das Root CA. Beide erhält man hier: Index of /certs


    Um es einfacher zu halten, ist hier der direkt Download:


    Jetzt besitzt ihr folgende Dateien für euer Zertifikat:

    • CSR: example.de.sha256.csr
    • KEY: example.de.key
    • CRT: example.de.crt
    • Intermediate Server CA: sub.class1.server.ca.crt bzw. sub.class2.server.ca.crt (je nach eurem Class Status)
    • Root CA: ca.crt


    4. SSL Zertifikat einrichten
    Um das Zertifikat einzurichten, müssen wir dem Webserver die entsprechende Konfiguration mitgeben. Das ganze sieht dann so aus:

    Code
    1. # SPDY ist ein experimentelles TCP-basiertes Netzwerkprotokoll von Google: http://de.wikipedia.org/wiki/SPDYlisten *:443 ssl spdy;# Keep-Alive Verbindungen aktivieren (Reduziert CPU Load)keepalive_timeout 70; # SSL Caching für mehr Performancessl_session_cache shared:SSL:10m;ssl_session_timeout 10m; # SSL Protokollessl_protocols TLSv1 TLSv1.1 TLSv1.2; # Cipher Suitesssl_prefer_server_ciphers on;ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5;# OCSP - Online Certificate Status Protocolssl_stapling on;ssl_stapling_verify on; # SSL Zertifikatessl_certificate /etc/ssl/example.de.crt; # Webseiten CRT + Intermediate Server CAssl_certificate_key /etc/ssl/example.de.key; # Webseiten Private Keyssl_trusted_certificate /etc/ssl/ca-certs.pem; # Intermediate Server CA + Root CA # Diffie-Hellman parameter for DHE ciphersuites# to generate your dhparam.pem file, run in the terminal# openssl dhparam -out /etc/ssl/dhparam.pem 4096ssl_dhparam /etc/ssl/dhparam.dh; # HSTS - http strict transport security# Achtung "Bug": includeSubDomains führt zu dem Problem, dass auch alle anderen Subdomains mit HTTPS geforcet aufgerufen werden, obwohl sie vielleicht kein HTTPS haben.add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload';# HTTPS Weiterleitung/Forceif ($scheme != "https") { rewrite ^ https://www.example.de$request_uri? perma}


    Jetzt müssen wir die Zertifikatsdateien entsprechend zusammenbauen, damit die Zertifikatskette in Ordnung ist:

    • In die Datei "example.de.crt" packen wir in folgender Reihenfolge die Zertifikate rein: Webseiten CRT + Intermediate Server CA
    • In die Datei "example.de.key" packen wir in folgender Reihenfolge die Zertifikate rein: Webseiten Private Key
    • In die Datei "ca-certs.pem" packen wir in folgender Reihenfolge die Zertifikate rein: Intermediate Server CA + Root CA

    Als nächstes benötigen wir noch die "dhparam.dh" Datei, um die Sicherheit nochmals explizit zu erhöhen. Das wird ebenfalls mit Hilfe von OpenSSL generiert:

    Code
    1. openssl dhparam -out /etc/ssl/dhparam.dh 4096


    Sobald die Dateien korrekt abgelegt wurden, kann die Konfiguration mit Hilfe eines Reloads aktiv geschaltet werden:

    Code
    1. service nginx reload


    5. Externe SSL Test Webseiten
    Ob euer SSL Zertifikat korrekt und mit den aktuell optimalsten Einstellungen eingerichtet wurde, könnt ihr auf den beiden nachfolgenden Webseiten sehr gut überprüfen, da diese immer aktuell gehalten werden:

    Ich hoffe, ich konnte hiermit einigen weiterhelfen und freue mich auf konstruktives Feedback! :)

  • Mit Hilfe der nachfolgenden Cipher Suites ist es möglich, alle 100 Punkte bei allen vier Kategorien zu erhalten:

    Code
    1. ssl_ciphers ECDH+AES256GCM:DH+AES256GCM:ECDH+AES256:DH+AES256:DH+AES:ECDH+3DES:DH+3DES:RSA+AES256GCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!SHA:!AES128;


    Aber ACHTUNG: Viele aktuelle Browser (z.B. Chrome, Firefox) unterstützen nur AES128 und kein AES256, wodurch diese Browser nie die Webseite aufrufen und anzeigen können. Aus diesem Grund würde ich die oben genannten Cipher Suites in Betracht ziehen und nutzen, um möglichst viele Browser zu unterstützen.


    Das ganze habe ich an meiner TS3-Tools.info Webseite getestet. Die SSL Labs Testergebnisse könnt ihr euch hier im PDF Format anschauen: SSL Labs - TS3-Tools.info Testergebnisse.pdf

  • Wichtiger Hinweis: StartCOM wird seit einigen Monaten nicht mehr als gültiger / vertrauenswürdiger Zertifikatsanbieter bei sämtlichen Browsern geführt. Insofern sind alle Zertifikate entsprechend "ungültig".