Blog via SSL

Ich habe mir jetzt doch mal einen Account bei StartSSL zusammen geklickt und mir da zwei Zertifikate für die Domains geholt, unter denen das Blog verfügbar ist. Nachdem ich nur eine IPv4-Adresse habe, hinter der ich das hosten kann (also ich hätte schon noch eine über, aber wer weiß, wofür ich die noch brauchen werde), funktioniert das ganze zwar völlig normal wenn man die Seite als www.incertum.net (oder als incertum.net, die StartSSL-Zertifikate haben immer einen Subject Alternative Name drin) aufruft - aber falls man sie als (www.)stefan-foerster.de ansprechen will, muß die Kombination aus Browser und Betriebssystem die Erweiterung Server Name Indication (SNI) unterstützen. Und damit ist dann Windows XP nativ raus, die dort vorhandene Version von Secure Channel kann einfach kein SNI. Alternative Browser wie z.B. Chrome sollten aber trotzdem funktionieren.

Im IPv6-Land ist das ganze übrigens kein großes Problem: Nachdem man hier IPs im Überfluss hat ist es kein Thema, für die SSL-Hosts, die verschiedene Zertifikate vorweisen sollen, auch jeweils eigene IPv6-Adressen zu verwenden, was ich so auch umgesetzt habe. Sprich, wenn jemand mit einem Windows XP und Internet Explorer IPv6 hat, dann sollte das sogar funktionieren. Um die Konfiguration halbwegs übersichtlich zu halten, habe ich sie soweit wie möglich modularisiert:

  • Der Standard-HTTP-Host tut nichts weiter, als eine permanente Umleitung auf die HTTPS-Seite weiterzugeben. Dabei wird die Variable $host und nicht server_name benutzt, weil letzere bei mehr als einem Servernamen in der Konfiguration immer auf den ersten Wert matched, nicht aber auf den, den der Browser aufgerufen hat. Beginnt die Konfiguration z.B. mit server_name www.incertum.net www.stefan-foerster.de ...;, dann würde eine Umleitung immer auf www.incertum.net landen. Das ist dann z.B. bei Safari-Browsern problematisch, wenn die nämlich einen Cookie von einer Domain haben, dann lassen sie sich nicht einfach so auf HTTPS umleiten.
  • Die Teile der SSL-Konfiguration, die pro Server gleich sind, habe ich in eine eigene Datei ausgelagert. Das ist im wesentlichen alles ausser dem Server-Namen, den Zertifikaten und den IPs. Mit der Direktive listen ... ssl default_server; legt man übrigens fest, welcher SSL-Host derjenige sein soll, der sein Zertifikat herzeigt, wenn der Browser kein SNI kann. Wie man weiterhin sieht, sind beide IPv6-SSL-Hosts jeweils als default_server markiert.
  • Die IPv6-Adressen sind keine Wildcard-Adressen, also benötigt man kein ipv6only=on.
  • Ebenso ist die eigentliche S9Y-Konfiguration für das Blog in ein eigenes File gewandert.
  • Die zusätzliche IPv6-Adresse wird ganz normal über die up/down-Direktiven in /etc/network/interfaces konfiguriert (und wie man sieht kommt die Hauptadresse via SLAAC

Das ganze sieht dann so aus:

# HTTP server for redirects only
server {
  server_name www.incertum.net incertum.net www.stefan-foerster.de stefan-foerster.de;
  listen 80 default_server;
  listen [::]:80 ipv6only=on default_server;

  return 301 https://$host$request_uri;
}


# (www\.)?incertum.net - SSL
server {
  ssl_certificate     /etc/ssl/private/www.incertum.net.crt.nginx;
  ssl_certificate_key /etc/ssl/private/www.incertum.net.key;

  listen 443 ssl default_server;
  listen [2a01:4f8:140:4422:5054:ff:fec8:b1c5]:443 ssl default_server;

  server_name www.incertum.net incertum.net;

  include /etc/nginx/common-ssl;
  include /etc/nginx/sites-available/s9y.conf;
}

# (www\.)?stefan-foerster.de - SSL
server {
  ssl_certificate     /etc/ssl/private/www.stefan-foerster.de.crt.nginx;
  ssl_certificate_key /etc/ssl/private/www.stefan-foerster.de.key;

  listen 443 ssl;
  listen [2a01:4f8:140:4422::b]:443 ssl default_server;

  server_name www.stefan-foerster.de stefan-foerster.de;

  include /etc/nginx/common-ssl;
  include /etc/nginx/sites-available/s9y.conf;
}

Selbstverständlich habe ich die entsprechenden TLSA-Records bereits im DNS hinterlegt. Lasst mich doch bitte wissen, falls ihr nach dieser Änderung Probleme beim Zugriff auf die Seite haben solltet, dann kann ich da gerne entsprechend nachfixen.