Nginx mit SSL-Unterstützung

Nachdem ich das Thema nun schon eine ganze Weile vor mir herschiebe, habe ich heute nun doch endlich meinen Nginx-Server für die Verwendung von SSL konfiguriert. Hierbei gibt es mehrere Ansätze. Angefangen bei "je ein Server für HTTP und ein Server für HTTPS" über "ein zentraler HTTPS-Server" bis hin zu Mischmaschlösungen ist alles dabei.
Da bei mir die möglichst einfache Wiederverwendung der einzelnen Konfigurationsteile an erster Stelle steht, wollte ich euch einmal zeigen, wie ich das ganze nun gelöst habe.

Fangen wir nochmal vorne an: In meiner Konfiguration gibt es eine zentrale Konfigurationsdatei, die einen HTTP-Block enthält. Für jede Domain gibt es dann eine separate Konfigurationsdatei, in der die Domain-spezifischen Konfigurationen enthalten sind (Redirects, optional PHP, etc.).

Zuerst einmal habe ich den Großteil der Konfiguration in die zentrale Konfigurationsdatei "/etc/nginx/nginx.conf" ausgelagert. In den dort enthaltenen HTTP-Block habe ich folgende Zeilen eingefügt:

1
2
3
4
5
6
7
  # SSL
  ssl_certificate           /var/www/ssl/ssl.crt;
  ssl_certificate_key       /var/www/ssl/ssl.key;
  ssl_ciphers               SSLv3+HIGH:RC4+MEDIUM:!aNULL:!eNULL:!3DES:!MD5:@STRENGTH;
  ssl_prefer_server_ciphers on;
  ssl_protocols             SSLv3;
  ssl_session_cache         shared:SSL:10m;

Hier konfigurieren wir, wo sich das SSL-Zertifikat und der private SSL-Schlüssel befinden. Wir geben an, welche SSL-Cipher (dazu gleich mehr) verwendet werden, welches SSL-Protokoll verwendet werden soll und wie groß der SSL-Session-Cache sein soll.

Kommen wir erst einmal zum Zertifikat. Genauso wie früher möchte ich mehrere Domains unter einer einzigen IP-Adresse hosten. Um für alle Domains SSL anbieten zu können, benötige ich ein Zertifikat, das mehrere Domain-Namen enthält. Wie das ganze grob funktioniert, hatte ich schon einmal beschrieben.

Kommen wir nun zu den SSL-Ciphern. Im Grunde besteht SSL aus einer Sammlung von Verschlüsselungs- und Hashing-Algorithmen, die jeweils einen Cipher ausmachen. Es gibt starke Cipher mit starken Algorithmen, aber auch schwache Cipher mit schwachen Algorithmen. Es gibt sogar Cipher komplett ohne Verschlüsselung oder auch welche ohne Authentisierung. Der genutzte Cipher-String sieht im ersten Moment möglicherweise etwas kompliziert aus, ist aber im Grunde halb so wild:
Da ich mich auf die Verwendung von SSLv3 beschränke, reduziere ich die verfügbaren Cipher auf starke SSLv3-Cipher. Zusätzlich werden (für alte Windows-Versionen) mittelstarke RC4-Cipher hinzugefügt. Abschließend werden Cipher mit MD5, Cipher mit 3DES und Cipher ohne Authentifizierung und ohne Verschlüsselung aus der Liste entfernt und die Liste anhand der Stärke der übrig gebliebenen Cipher sortiert. Dieser Blogeintrag hat mir sehr beim Verstehen des Cipher-Strings geholfen.

Nachdem nun also alles wichtige vorbereitet ist, gibt es in den einzelnen Domain-spezifischen Konfigurationsdateien nur noch eine Sache zu tun: Es muss angegeben werden, dass der Server für die entsprechende Domain mit SSL auf Port 443 horchen soll. Hierzu muss im entsprechenden SERVER-Block folgende Zeile ergänzt werden:

1
  listen 443 ssl;

Voila! Wir haben SSL für alle Domains vorbereitet und können es nach Belieben für einzelne SERVER-Blöcke einschalten. :-)

Verschlüsselte Grüße, Kenny

P.S.: Eine interessante Information, die ich nebenbei bei meiner Recherche gefunden habe: Mit folgendem Befehl kann man SSL-verschlüsselte Verbindungen aufbauen und testen (also so wie Telnet nur eben per SSL):

1
openssl s_client -connect example.com:443 -state -debug

3 Kommentare » Schreibe einen Kommentar

  1. Sollte man nicht zusätzlich noch TLSv1 angeben? Die AES Verschlüsselungen also auch alles > 128 Bit sind ja nur in TLSv1 drin

      • Ja, ich hab RC4 in der Kette auch vorgezogen. Trotzdem werden wir wohl um TLS nicht rumkommen. :-)

        Also im Moment sieht die Kette bei mir so aus:
        RC4-SHA:AES256-SHA:AES128-SHA

Hinterlasse eine Antwort

Um Ihnen beim weiteren Kommentieren auf dieser Webseite die erneute Eingabe Ihrer Daten zu ersparen, wird beim Absenden Ihres Kommentars ein Cookie an Ihren Browser gesendet und von diesem gespeichert. Mit dem Absenden eines Kommentars auf dieser Webseite stimmen Sie der Speicherung und Übertragung dieses Cookies explizit zu.

Pflichtfelder sind mit * markiert.


Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>