„Sich nie wieder sorgen um auslaufende Zertifikate machen“, das klingt fantastisch? Easy! Über eine DNS-Abfrage lassen sich über Let´s Enrcypt automatisch Zertifikate erstellen. Dabei habe ich bisher oft das Argument gehört „Naja, Let´s Encrypt Zertifikate sind nicht Enterprise und die Hostnames tauchen in öffentlichen Listen auf“. Meine bisherige Erfahrung mit diesen Zertifikaten ist jedoch durchweg positiv. Kein Browser hatte diese Zertifikate bisher als unsicher eingestuft und die Hostnames konnte ich in keiner öffentlichen Liste finden.
Azure Konfiguration
Bevor wir loslegen können, müssen wir eine Kleinigkeit in Azure vorbereiten. Der Initiator (z.B. Certbot) muss für eine erfolgreiche DNS Challange einen TXT Record im DNS hinterlegen können. Dazu eignet sich ein Azure Service Principal (Azure SP) für die OAuth Authentifizierung. Über die Azure CLI können wir mit einem einzigen Befehl ein SP anlegen:
az ad sp create-for-rbac --name sp-acme-dns-challange \
--role "DNS Zone Contributor" \
--scopes <scope>
Dem Argument “role” geben wir das Value „DNS Zone Contributor“ mit, um die Berechtigungen auf das nötigste zu beschränken. Das Argument „scope“ erhält den Pfad zur DNS-Zone Ressource. Der Pfad lässt sich schnell über die GUI kopieren, wenn du dir den JSON View direkt in der DNS Ressource anzeigen lässt.
Sobald du den Befehl abgesetzt hast, erhältst du wichtige Informationen als Response. Notiere dir die appID, das Passwort und die Tenant ID. Über folgenden Befehl kannst du dir nochmal die Details zu deinem Azure Service Principal anzeigen lassen:
az ad sp show --id <service principal id>
Über die Azure GUI findest du das Service Principal unter den Enterprise Applications, du musst jedoch den Application type Filter auf „All Applications“ einstellen.
Certbot
Wir verwenden unser Beispiel Certbot und Linux Ubuntu. Zunächst solltest du Certbot gemäß der Dokumentation installieren. Anschließend legen wir eine Datei an, um die Azure Service Principal Credentials abzuspeichern.
# credentials-file
# Using a service principal (option 1)
dns_azure_sp_client_id = <azure_sp_client_id>
dns_azure_sp_client_secret = <azure_sp_client_secret>
dns_azure_tenant_id = <azure_tenant_id>
# Zones (at least one always required)
dns_azure_zone1 = <resource id dns zone>
dns_azure_zone2 = <resource id dns zone>
Du solltest für diese Datei die passenden Berechtigungen einstellen, damit nicht jeder User auf dem Server die Datei lesen kann.
chmod 0600 credentials-file \
chown root:root credentials-file
Jetzt können wir den Certbot Command absetzen:
certbot certonly --authenticator dns-azure --preferred-challenges dns --noninteractive --agree-tos --email someone@mydomain.online --renew-by-default --dns-azure-config credentials-file -d mydomain.online
Du kannst optional das Flag „—noninteractive“ weglassen, dann siehst du den Fortschritt, dann werden optionale Eigenschaften für die Zertifikatsanfrage abgefragt.
Als nächstes konfigurierst du noch einen Cronjob, um das Zertifikat automatisch erneuern zu lassen.
0 12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q