The requirement was to set up a wildcard certificate on azure, so I used a nice tool called certbot that can generate single subdomain certificates or a wild card certificate.
For the creation of a wild car certificate, we need to be able to alter the DNS TXT records and via azure we can achieve this via the
- Install certbot onto a server (I am using a linux server)
- User role to only allow DNS TXT record updates
- Allow the managed identity (in essence the server that is altering the DNS TXT records)
So, to start things off lets install the certbot and I am using the snap package manager and also the nginx as the web server.
snap install core
snap refresh core
snap install –classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot
The certbot plugin to converse with the azure dns is certbot-dns-azure, as this isn’t part of the offical packages we have to use the “–edge” option below and also allow the certbot trust this plugin.
snap set certbot trust-plugin-with-root=ok
snap install –edge certbot-dns-azure
snap connect certbot:plugin certbot-dns-azure
For the certbot dns azure plugin to function automatically we need to create a file within the .azure folder called dns.ini ( e.g. /root/.azure/dns.ini or ~/.azure/dns.ini)
certbot renew –dry-run
To fill in the options below are as below (small hint! the subscription ID + resource group name could be obtained from the URL when you goto the dns zone within azure you want to use!)
- linux server ID = I got this after the creation of the role access
- dns cloud name = is the azure named resource of your dns zone
- subscriptionID = your subscription ID
- resource groupname = the groupname of resource
dns_azure_msi_client_id = <linux server ID>
dns_azure_zone1 = <dns cloud name>:/subscriptions/<subscriptionID>/resourceGroups/<resource groupname>/providers/Microsoft.Network/dnsZones/<dns cloudname>
The last part of this solution is to allow the managed identy (e.g. the linux server) to update the DNS TXT records for the azure dns zone.
Iif you goto your subscription -> access control (IAM) — On the left menu -> Add(top bar) custom role
In the new custom role, please define the basics e.g. name, but within the permissions use the “add permission” and include the one below (Microsoft.Network/dnszones/TXT
The json would be something akin to
{ "id": "/subscriptions/<subscriptionID>/providers/Microsoft.Authorization/roleDefinitions/<roleID>", "properties": { "roleName": "DNS TXT Contributor", "description": "User role only allows DNS TXT updates.", "assignableScopes": [ "/subscriptions/<subscriptionID>" ], "permissions": [ { "actions": [ "Microsoft.Network/dnszones/TXT/read", "Microsoft.Network/dnszones/TXT/write" ], "notActions": [], "dataActions": [], "notDataActions": [] } ] }}
and then within the DNS Zone (your DNS configuration) go to Access Control (IAM) and then click “add role assignment” where the role will be the role that you created above
and then we just need to associate it (members) with your managed identities (e.g. your webserver!)
The next post (once I have created it, there will be a link here!) will be about how to create the certificate and then convert it into a PFX file for uploading into the azure key vault file storage.
AND THAT IS IT 🙂 — if you need any more advice on certain areas please say!