Kostenlose SSL-Zertifikate für Azure Functions mit Letsencrypt

Folgendes Thema ist mir untergelaufen als ich meine eigene DNS-Domäne einbinden wollte mit Azure Functions:

In der Regel sind Functions in einem speziellen App Service gehostet und haben daher fast die gleichen Einstellungen und Möglichkeiten. Der Hostname für der appservice ist i.d.R. so etwas wie [appservicename].azurewebsites.net und die Aufrufe gehen standardmäßig an [appservicename].azurewebsites.net/api/[funktionsname]

Ich wollte aber, dass die URL beispiel.meinedomaene.de/api/[funktionsname] lautet, und da kommt immer ein Validierungsfehler vom Browser oder sonstige Clients auf – da eben Azure mit seinem *.azurewebsites.net-Zertifikat antwortet und entspricht somit nicht unbedingt den Anforderungen für Produktivsysteme.

Die Lösung fand ich über den Blogpost von Jan de Vries [auf Englisch] zum Thema: https://jan-v.nl/post/enable-ssl-for-your-azure-functions Der Beitrag beschreibt wie man eine Handler-Funktion erstellt und zeigt auf über einen weiteren Link wie die Extension Azure Let’s Encrypt von Simon Pedersen zu installieren und zu konfigurieren ist.

  • Die letsencrypt-Funktion gibt eine JSON-formatierte Antwort zurück, was der ACME-Service von Letsencrypt nicht erwartet. Hier musste ich z.B. den Header im Antwort auf „application/octet-stream“ unwandeln damit der ACME-Challenge zur Zertifikaterstellung klappte (Code dazu s. unten)
  • Die Azure-Funktion ist am besten in Visual Studio 2017 zu erstellen, da sonst im Portal standardmäßig eine C# Script-based Function einbaut (.csx)
  • Berechtigungen können direkt auf „Anonym“ bei der Erstellung gesetzt werden (Standard ist „Function“) – sonst kann der Letsencrypt-Dienst nicht auf unsere Function zugreifen
resp.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream");

Kommentar verfassen