Let’s encrypt Suave: Der klassische Weg

Im letzten Beitrag habe ich einen Einstieg gemacht zu einer Lösung, die unseren Suave Server am Ende der Reihe automatisch mit einem Let’s encrypt Zertifikat versorgen soll. Der heutige Beitrag steht ein wenig außerhalb dieser Reihe, da wir einen Weg betrachten wie man das gleiche Ziel ohne jegliche eigene Implementierung erreicht. Diese Option habt ihr nämlich auch.

Vorbereitungen: CertBot

Unser Weg beginnt damit, dass wir uns mit CertBot vertraut machen. Das ist ein Programm das die Rolle des ACME Client übernimmt, den wir beim letzten Mal mit Certes als API anprogrammiert hatten. CertBot ist Kommandozeilenprogramm und zum Zeitpunkt des Schreibens nur für unixoide Betriebssystem verfügbar. Für meine Zwecke habe ich in Azure eine Ubuntu Instanz eingerichtet. Daher verwende ich im Folgenden den Paketmanager von Ubuntu/Debian. Falls ihr eine andere Linuxdistribution verwendet, oder ein anderes Betriebssystem, müsst ihr gegebenenfalls anders vorgehen. Anleitungen dazu findet ihr auch auf der CertBot Webseite.

In einem Terminal führen wie folgende Befehle aus:

 

CertBot wird in einem persönlichen Paket-Repository bereitgestellt und nicht über die Repositories die Ubuntu selber pflegt.

Daher müssen wir zuerst das software-properties-common installieren (Zeile 2).
Damit bekommen wir die zusätzlichen Kommandos für den Paketmanager installiert, die uns dann in Folge erlauben das certbot Repository hinzuzufügen (Zeile 3).
Zuletzt können wir dann CertBot selbst installieren (Zeile 5).

Würden wir statt Suave einen der großen bekannten Webserver verwenden wie Apache oder Nginx, könnten wir einen darauf angepassten CertBot installieren. Den generischen CertBot verwenden wir also nur, weil es keine spezifische Version für Suave gibt.

Vorbereitungen: OpenSSL

In den meisten Distributionen ist OpenSSL bereits installiert. So auch in meiner Ubuntu 17.04 Azure Instanz. Falls OpenSSL bei euch nicht installliert sein sollte, müsst ihr es noch nachinstallieren, da wir es später brauchen werden, um die Zertifikate von PEM nach PFX zu konvertieren.

Zertifikat holen

Nachdem alle Vorbereitungen nun abgeschlossen sind, können wir beginnen. Mit folgendem Befehl starten wir CertBot.

 

Denjenigen unter euch die auch den letzten Beitrag gelesen haben, dürften Parallelen auffallen zu den Schritten hier und dem Code den wir letztes Mal geschrieben haben.Daraufhin kommt eine Folge von Abfragen. Wir wählen den temporären Webserver (1), da wir ja keine Zeile Code schreiben wollen. Dann geben unsere Email-Adresse an. An diese Adresse kommen dann z.B. Mails mit dem Hinweis, dass unser Zertifikat bald abläuft, wenn wir es nicht früh genug erneuert haben. Dann müssen wir die Bedingungen akzeptieren (A) und können auswählen, ob wir Nachrichten von der EFF haben möchten.  Zu guter Letzt müssen wir den öffentlich erreichbaren Hostname angeben unter dem der Server erreichbar ist.

Wenn alles geklappt hat, wurden am Ende unter /etc/letsencrypt/live/<hostname> mindestens zwei Dateien abgelegt worden sein: eine privkey.pem und eine fullchain.pem. Damit können wir nun mit dem nächsten Schritt weitermachen.

In Suave integrieren

Am liebsten würden wir die Zertifikate gleich in Suave verwenden. Leider versteht Suave Zertifikaten im PEM Format nicht direkt. Es gibt zwar auf nuget.org das Paket Suave.OpenSSL mit dem das funktionieren sollte, allerdings waren meine Versuche nicht erfolgreich.

Aber nicht umsonst haben wir ja vorhin OpenSSL einsatzbereit gemacht. Nur damit die Pfade kürzer ausfallen, wechsele ich vorher in das Verzeichnis.

 

OpenSSL fragt nach einem Passwort für die erzeugt PFX Datei und anschließend haben wir unsere Zertifikatsdatei, die wir wie üblich in Suaves HTTPS Bindings verwenden können.

Fazit

Das war es schon. Was noch übrigbleiben würde, wäre einen Teil dieses Ablaufs zu automatisieren, z.B. über einen Cron-Job. Damit hätten wir auch unser Ziel erreicht. Wir haben unser Zertifikat. Als ich diesen Weg das erste Mal beschritten bin, war ich erst mal zufrieden. Allerdings haben sich für mich zwei Probleme aufgetan. Zum einen fand ich es kompliziert, den Ablauf der Zertifikatserneuerung zu orchestrieren mit dem Betrieb des Servers, da Port 80 nur einmal vergeben werden kann. Zum anderen wollte ich eine Lösung haben, die ich ohne manuelle Schritte ausliefern kann, da ich kurz nach dem ersten Server, einen zweiten Server in Betrieb nehmen wollte.

Das ist meine Motivation, warum ich eine Lösung für mein Problem in F# baue.

Danke für’s Lesen und bis zum nächsten Mal.