Listing des Web Apps Azure et mise à jour des certificats SSL
Parmi les opérations de gestion des Web Apps Azure, il y en est une qui revient régulièrement, c’est la configuration et la mise à jour des certificats.
Pour cela, il faut tout d’abord procéder au renouvellement de son certificat chez son Registrar, le récupérer au format PFX afin d’être exploitable, puis l'associer au site. Cette dernière opération peut se faire manuellement via le Portail Azure, comme décrit dans cet article (qui explique aussi les étapes initiales qui ne sont pas forcément évidentes la première fois) : https://docs.microsoft.com/en-us/azure/app-service-web/web-sites-configure-ssl-certificate.
Cependant, vous pouvez être amené à gérer un nombre important de certificats, ou tout simplement des certificats « wildcard » (par exemple *.contoso.com ») que vous avez associé à différents sites. Du coup, cela s’avère plus long car il faut tout d’abord identifier les applications dont le certificat approche de la date d’expiration, puis, pour chacune d’entre elles, uploader le nouveau certificat puis l’associer au host name.
Pour remédier à cela : PowerShell ! Vous trouverez donc ci-joint un script qui :
- Se connecte à votre souscription Azure
- Liste toutes les web apps avec leur hostnames et certificats (exporté au format CSV)
- Regarde s’il y a des bindings SSL configurés ; si c’est le cas, il vérifie si la date d’expiration est proche (30j), et propose dans ce cas son remplacement
Pour le remplacement des certificats, nous fournissons un fichier CSV avec : friendly name, chemin vers le PFX et le mot de passe. Par ex:
FriendlyName;Path;Password *.contoso.com;C:\Certificates\ContosoCom2017.pfx;contosopassword
Enfin, j'ai pris soin de vous mettre les quelques variables pour spécifier le nom de la souscription, le nombre de jours avant avertissement sur l'expiration du certificat ainsi que le chemin vers les fichiers CSV.
Si vous voulez aller encore un peu plus loin, vous pouvez consulter cet article https://docs.microsoft.com/en-us/azure/app-service-web/app-service-web-app-powershell-ssl-binding qui vous permettra par exemple de configurer un certificat pour un site qui n'en avait pas, ou de supprimer les anciens bindings (ce que j'ai préféré ne pas inclure directement dans le script).
Et voici le script :
# Export your Azure websites settings and update the SSL Certificates # By Gaetan BOUVERET - Infinite Square - https://blogs.infinitesquare.com/users/gbouveret $subscription = "Your subscription name" $exportCsvFilename = "./azurewebsites.csv" $newCertCsvFilename = "./Certificates.csv" $maxDaysBeforeExpiration = 30 $csvDelimiter = ";" $arrayJoinDelimiter = "," # Connect to Azure Write-Host "Login to Azure" Login-AzureRmAccount # Select $subscription Write-Host "Select subscription $subscription" Get-AzureRmSubscription -SubscriptionName $subscription | Select-AzureRmSubscription # CSV file with friendly name, path to PFX and password $newCertificates = Import-Csv -Path $newCertCsvFilename -Delimiter $csvDelimiter $azSites = Get-AzureRmWebApp $export = @() foreach($webApp in $azSites){ $sslHosts = @() Write-Host " > Parsing web app $($webApp.SiteName)" -f Green $urls = [System.String]::Join(",", $webApp.HostNames) Write-Host " URLs : $urls" -f Yellow foreach($sslHost in $webApp.HostNameSslStates) { if ($sslHost.SslState -ne "Disabled") { $curCert = Get-AzureRmWebAppCertificate -ResourceGroupName $webApp.ResourceGroup -Thumbprint $sslHost.Thumbprint $curSslInfo = "$($sslHost.Name) : certificate $($curCert.FriendlyName) expires on $($curCert.ExpirationDate)" Write-Host " Ssl configuration : $curSslInfo" -f Yellow $ts = NEW-TIMESPAN -Start (Get-Date) -End $curCert.ExpirationDate if ($ts.TotalDays -lt $maxDaysBeforeExpiration) { Write-Host " EXPIRED IN LESS THAN $maxDaysBeforeExpiration days !" -f red $newCert = $newCertificates | Where-Object { $_.FriendlyName -eq $curCert.FriendlyName } if ($newCert -ne $null) { $ok = Read-Host -Prompt " - Do you want to replace the certificate with the new one ? (Y/N)" if ($ok -eq "Y") { $newCertBinding = New-AzureRmWebAppSSLBinding -ResourceGroupName $webApp.ResourceGroup -WebAppName $webApp.Name -CertificateFilePath $newCert.Path -CertificatePassword $newCert.Password -Name $sslHost.Name if ($newCertBinding -ne $null){ $curCert = Get-AzureRmWebAppCertificate -ResourceGroupName $webApp.ResourceGroup -Thumbprint $newCertBinding.Thumbprint $curSslInfo = "$($sslHost.Name) : certificate $($curCert.FriendlyName) expires on $($curCert.ExpirationDate)" Write-Host " > Ssl configuration updated : $curSslInfo" -f Yellow } } } } $sslHosts += $curSslInfo } } $sslStatus = [System.String]::Join($arrayJoinDelimiter, $sslHosts) $conf = New-Object PsObject $conf | Add-Member -Name SiteName -MemberType NoteProperty -Value $webApp.SiteName $conf | Add-Member -Name DefaultHostName -MemberType NoteProperty -Value $webApp.DefaultHostName $conf | Add-Member -Name HostNames -MemberType NoteProperty -Value $urls $conf | Add-Member -Name SSL -MemberType NoteProperty -Value $sslStatus $export += $conf } $export | Export-Csv -Path $exportCsvFilename -Delimiter $csvDelimiter
Commentaires