Kreuvfs Allerweltsblog

2016-04-20

HTTPS: Blog mit sicherer Verbindung

Abgelegt unter In eigener Sache,Software von Kreuvf um 11:42:15

Seit gestern ist dieser Blog nicht mehr nur via HTTP, sondern auch via HTTPS zu erreichen. Dadurch wird die Kommunikation vom Benutzer zum Server und umgekehrt verschlüsselt, sodass das routinemäßige Abhören von Verbindungen durch die Bösen deutlich erschwert bis unmöglich gemacht wird.

Umstellungsprobleme

Auch die Feeds sind jetzt via HTTPS zu erreichen, was aber bedeutet, dass ihr die URL des Feeds in eurem Feedreader ändern müsst. Dadurch werdet ihr zwangsläufig doppelte Einträge erhalten, zumindest war das meine Beobachtung in Thunderbird.

Da dieser Blog wie so vieles historisch gewachsen ist, habe ich Links auf meine eigenen Seiten und Blogbeiträge im Blog immer mit der vollen URL angegeben. Da der Blog ab sofort aber unter zwei Protokollen erreicht werden kann, würde die explizite Angabe des Protokolls in den Links dazu führen, dass beim Folgen von Links auf meinen Seiten ihr ständig zwischen der ungesicherten und der gesicherten Variante wechseln würdet. Ich habe dazu sämtliche URLs in relative URLs umgewandelt, sodass die Angabe des Protokolls fehlt. WordPress ist nativ leider zu scheiße (oder ich zu dumm), um sämtliche von WordPress generierten Links ebenfalls ohne Protokoll generieren zu lassen, weshalb ich früher oder später davon wegkommen werde und mir ein auf meine Bedürfnisse zugeschnittenes CMS suchen/erstellen werde.

Skript zur Umstellung

Weil ich selbst keine Lust darauf hatte meine ganzen Artikel nach Verweisen auf meine Seite(n) zu durchsuchen und das Protokoll zu verändern, habe ich mich des Kommandozeilenprogramms „sed“ und regulärer Ausdrücke bedient. Dabei herausgekommen ist folgendes Snippet, das sämtliche Verweise in den Attributen „href“ und „src“ so verändert, dass das Protokoll entfernt wird:

sed -r -i \
-e "s_href=([\"'])?https?://([a-z0-9\.]*\.)?kreuvf\.de([^\"' ]*)\1_href=\1//\2kreuvf.de\3\1_g" \
-e "s_src=([\"'])?https?://([a-z0-9\.]*\.)?kreuvf\.de([^\"' ]*)\1_src=\1//\2kreuvf.de\3\1_g" \
datenbankdump.sql

Dieses Snippet stellt keinen vollwertigen HTML-Parser dar und wurde nur mit Bash und dem von mir erzeugten HTML getestet. Das heißt insbesondere, dass

  • kein Whitespace um das Gleichheitszeichen zwischen Attributname und Attributwert vorkommt,
  • der Attributwert ausnahmslos in doppelte Anführungszeichen gefasst ist ("), auch wenn das Snippet ebenso mit einem Apostroph (') klarkommen sollte,
  • das Protokoll immer angegeben ist und
  • Verweisziele keine Leerzeichen enthalten.

„sed“ wird durch den Schalter „-r“ in den Extended-Regex-Modus versetzt, überschreibt durch „-i“ die Eingabedatei und führt den hinter dem „-e“ befindlichen Befehl aus. Der Befehl „s“ steht für „Suchen & Ersetzen“, das Suchmuster befindet sich zwischen dem ersten und zweiten Unterstrich, die Ersetzung zwischen dem zweiten und dritten Unterstrich. Der Schalter „g“ am Ende des Befehls sorgt dafür, dass „sed“ alle Treffer einer Zeile sucht und ersetzt statt nur dem ersten. Die Backslashes am Ende der Zeile gestatten es den Befehl über mehrere Zeile zu schreiben. Falls jemand Hilfe beim Anpassen des Snippets braucht, meldet euch einfach per Mail.

Das Verfahren sieht wie folgt aus:

  1. Vollständiges Datenbank-Backup anlegen, zum Beispiel mit dem Plugin „WordPress Database Backup“
  2. Snippet auf eine Kopie des Datenbank-Backups anwenden
  3. Bearbeitetes Datenbank-Backup in eine Testdatenbank einspielen
  4. Testen, ob der Blog bei Verwendung der Testdatenbank noch funktioniert (Login, Protokollabhängigkeit der Links)
  5. Bearbeitetes Datenbank-Backup in die Live-Datenbank einspielen

Sollte ich auf bislang unentdeckte Probleme stoßen, werde ich den Artikel entsprechend aktualisieren.

Warum erst jetzt?

In meinem Tarif wäre früher schon die Option gewesen einen Verschlüsselungsproxy zu benutzen. Das empfand ich aber immer als sehr unschön, da sämtliche Links dann auch immer den Proxy drin gehabt hätten. Ich habe daher darauf gewartet, dass irgendwann mal echte Zertifikate für meine Domain(s) zu erschwinglichen Preisen ohne großen Aufwand möglich werden.

Dieser Zeitpunkt ist jetzt gekommen und die Umstellung ist nur möglich, weil mein Webhoster, all-inkl.com, die Nutzung von Zertifikaten von Let’s Encrypt vor nicht mal zwei Wochen ermöglicht hat. Zusätzlich dazu hat Let’s Encrypt letzte Woche Dienstag den Testbetrieb verlassen.