Bulk/mass change SSL certificates on Azure app services (web apps) - azure

I've a wildcard SSL that has expired, and I have the new cert (different authority) uploaded to Azure already..
..but I'd like to know if there's a way to bulk change all the sites using the old cert, over to the new cert. On normal IIS when you make a change for any one of your sites on the old cert, to the new cert, it asks you if you want to update other bindings that are using the old cert so that they also use the new cert. I've around 30 sites I need to move to the new cert and it's going to be quite a drag one by one
Is there an equivalent functionality on Azure? Powershell is acceptable if the portal.azure.com won't do it..

I've been using Azure CLI in Powershell for this. First build a CSV file or array with the values. It will need to contain:
- Web App Name
$Thumbprint
Then iterate through
$Thumbprint = "12bnhgikjbkj13kjbblahblah"
$WebApps = #("WebApp1","WebApp2","WebApp3") #OR
Foreach ($WebApp in $WebApps) {
az webapp config ssl bind --certificate-thumbprint $Thumbprint --ssl-type SNI --resource-group ResourceGroupName --name "$WebApp"
}
You can also do it with New-AzureRmWebAppSSLBinding from here. Also a guide here on how to do it.

I used the following code in Azure Cloud Shell to enumerate how many apps were using the old thumbprint and updated them to the new one. I found this easier than writing down each of the app service names.
You'll need to make sure you import your new certificate first.
az account set --subscription "My Application"
$webapp_ids=(az webapp list --query "[?hostNameSslStates.[thumbprint=='OLD_THUMBPRINT']].id" --output tsv)
az webapp config ssl bind --certificate-thumbprint "NEW_THUMBPRINT" --ssl-type SNI --ids $webapp_ids

Related

How can i retrieve Azure app service certificate details using powershell?

I am trying to retrieve app service certificate details , but it only retrieves for the entire ResourceGroup using powershell as follows:
az webapp config ssl list --resource-group "TestResourceGroup" | ConvertFrom-Json
There are a number of app services in this resource group. I want the certificate details for a certain app service not all .
How can i get the details for a particular app service ?
You can try using az webapp config ssl show --resource-group <RG_val> --certificate-name <naked_FQDN> (not sure what you need to return). Or alternatively use a JMESPath on the az webapp config list to control what you are returning.
Thanks #mklement0, I have reproduced in my environment and got expected results as below and I followed Microsoft-Document:
$r=az webapp config ssl list --resource-group XX
$r.WebAppName.Certificate
$r | ConvertFrom-Json
XX- Name of the resource group

Unable to update SSL cert while using multiple basic listener using WAFV2 Azure App Gateway

I am having trouble uploading a new SSL pfx certificate onto my WAF V2 application gateway. I currently have 3 basic wildcard listeners setup (*.contoso.com *.fabrikam.com and *.adatum.com for example) and I would like to update the certificate associated with *.contoso.com.
The problem with using the UI is that if I attempt to update and save the certificate on the listener I get an error message indicating "This Basic HTTP listener cannot use the same frontend port as an existing listener". I understand this is likely because using multiple basic listeners is still in preview and can only be setup via powershell or ARM templates. I originally setup the gateway via ARM templates.
I instead attempted to update the listener's certificate using powershell. I first uploaded the pfx cert to a key vault. I then created a user managed identity with azure role assignments for both the app gateway and the key vault. After, I ran the following powershell commands from inside the portal's CLI but got the resulting error message.
PS > Select-AzureRmSubscription -Scope CurrentUser -SubscriptionName "Pay-As-You-Go"
PS > $appgw = Get-AzApplicationGateway -ResourceGroupName "myresourcegroup" -Name "myappgateway"
PS > $secret = Get-AzKeyVaultSecret -VaultName "mykeyvault" -Name "contoso-cert"
PS > $secretId = $secret.Id
PS > set-AzApplicationGatewaySSLCertificate -Name "contoso-cert" -ApplicationGateway $appgw -KeyVaultSecretId $secretId
PS > Set-AzApplicationGateway -ApplicationGateway $appgw
Set-AzApplicationGateway: Application Gateway 'myappgateway' requires a 'UserAssigned' Identity with 'get' access policy to the referenced KeyVault. Please provide so by using top level 'Identity' property.
Why am I unable to update the certificate on the basic listener using powershell? Is there any alternative option I can try in order to set the certificate? Please help
Pretty sure I came across this same issue when looking at the Wildcard Listeners Preview in App Gateway.
I don't have a test environment configured in such a way that I can try this for you at the moment, but I believe the solution was to create a Multisite HTTPS listener (instead of basic) with an arbitrary FQDN, and using the same SSL cert as the one you want to update. Then use that listener to update the SSL cert (you could probably even update the cert at the same time as you create the listener).
Let us know how you get on!

PowerShell : binding existing certificate in resource group

Im trying to bind an exisiting certificate in the resource group in a custom domain.
New-AzWebAppSSLBinding -ResourceGroupName $webappname -WebAppName $webappname -Thumbprint "$newthumbprint" -Name "$customdomain"
When I Debug this the custom domain isn't found, But when I check the domain in microsoft azure under tls/ssl bindings, the domain is there with his old thumbprint.
When im using the original domain of the webapp (.azurewebsites.net) then it would say that there is a conflict because in the new certificate is that domain not registered and thats good because I dont want that.
Anyone know how I can change the thumbprint of customdomains in powershell instead of waste my time in microsoft azure application and doing it more then 100 times manually...
For the error, "custom domain isn't found" or "Hostname 'www.exmaple.com' does not exist", here are possible reasons:
You could check the certificate's subject name must match the domains used to access the Web App.
You should find the existing certificate under TLS/SSL settings---Private Key Certificates. When you run the PowerShell commands, ensure that you type the correct Hostname and matched Thumbprint.
The command is working well on my side.
In addition, If you update an SSL certificate from a local machine to the Azure web app, you can use this command.
New-AzWebAppSSLBinding -ResourceGroupName $webapprg -WebAppName $webappname -CertificateFilePath $PathToPfxFile -CertificatePassword $PlainTextPwd -Name $customdomain

How do I setup lets encrypt for an Azure Linux Service Web App

I have found plenty of guides on how to set up Lets Encrypt for Azure Windows Web App Services, but I can't find any at all for Linux based services.
Here are two example of such tutorials (that require windows).
https://www.hanselman.com/blog/SecuringAnAzureAppServiceWebsiteUnderSSLInMinutesWithLetsEncrypt.aspx
https://www.youtube.com/watch?v=C6V_mBo-gnE
In the tutorials above, and all other tutorials I have found you need to use Web App Extensions to do the actual updating of the cert every 3 months. But these are not available on Linux apps.
This is all you see in the Azure portal when you try to navigate to it.
So, does anyone have any links, or helpful tips on how to set up automated Let's encrypt certificates for Azure Linux Services?
I'm sure people would want Lets Encrypt for Linux apps as well?
You could set up a Let's Encrypt SSL Cert for Azure Web App with Linux in 5 steps.
Install Certbot client
Create Let's Encrypt Cert with Certbot (Manually)
Convert PEM to PFX for Azure using OpenSSL
openssl pkcs12 -inkey /work-dir-path/live/website.com/privkey.pem -in /work-dir-path/live/website.com/cert.pem -export -out /work-dir-path/live/website.com/cert.pfx
Upload PFX cert to Azure Portal with Azure CLI method
az webapp config hostname add --webapp-name $webappname --resource-group $resourceGroup \ --hostname $fqdn
thumbprint=$(az webapp config ssl upload --certificate-file $pfxPath \ --certificate-password $pfxPassword --name $webappname --resource-group $resourceGroup \ --query thumbprint --output tsv)
Bind uploaded SSL certificate to your webapp Portal with Azure CLI method
az webapp config ssl bind --certificate-thumbprint $thumbprint --ssl-type SNI \ --name $webappname --resource-group $resourceGroup
Alternatively, Azure lets you create a free certificate and add it your App Service app at the click of a couple buttons. It's issued by DigiCert, managed by App Service, and renewed automatically. See Azure docs.
I found a very good solution to this issue recently. You can use the let's encrypt web app renewer to install and renew your certificates for the Linux Web Apps.
Create a free app plan for windows
Create a web app for windows
Follow the instructions on the Github page - set it up to renew the linux web app certs (as many as you want)
Schedule a job to hit the webook or use a azure function or any other option to trigger the job every 3 months.
There are a few tricks to getting it working correctly with .net core on linux especially if you are using spa services. I had to set the letsencrypt:webAppName-webRootPath configuretion to d:\home\site\wwwroot\wwwroot because of the spa static files.
Done!

Generate client certificate to service fabric cluster

According to this tutorial Create a Service Fabric cluster by using Azure Resource Manager , I created the server Self-Signed .pfx certificate.After that I enter certificate thumbprint,SourceVault,CertificateURL to azure portal.
What should I do to get client certificate,to enter its thumbprint to azure portal?
When you generated the client cert you should have generated the thumbprint at that point. If not then you should be able to install that cert locally on your machine (If it's not already) and using MMC go into the properties and find the thumbprint there to copy and paste, keep in mind it needs to have all spaces removed.
Did you uplooad the certificate to the keyvault?
Invoke-AddCertToKeyVault -SubscriptionId <guid> -ResourceGroupName westus-mykeyvault -Location "West US" -VaultName mywestusvault -CertificateName mycert -Password "<password>" -UseExistingCertificate -ExistingPfxFilePath "C:\path\to\mycertkey.pfx"
After that - you'll be able to fetch the thumbprint as specified in the guide.
Name : CertificateThumbprint
Value : E21DBC64B183B5BF355C34C46E03409FEEAEF58D
Name : SourceVault
Value : /subscriptions/<guid>/resourceGroups/westus-mykeyvault/providers/Microsoft.KeyVault/vaults/mywestusvault
Make sure to follow all the steps in the guide you listed and you should have your inputs.

Resources