/// <summary> /// Checks whether the Azure resource needs a new certificate /// </summary> /// <returns>True if a new certificate should be requested</returns> public static async Task <bool> NeedsNewCertificateAsync() { ResourceConfiguration resource = await GetResourceConfigurationAsync(); IAppServiceCertificate existingCert = resource.ExistingCertificates? .Where(c => c.Issuer.Contains(Constants.DefaultCA)) .OrderByDescending(c => c.ExpirationDate) .FirstOrDefault(); if (existingCert == null) { return(true); } TimeSpan timeUntilExpiry = existingCert.ExpirationDate - DateTime.Now; if (timeUntilExpiry < Settings.TimeBeforeExpiryToRenew) { return(true); } _logger.LogInformation($" Existing certificate with thumbprint {existingCert.Thumbprint} is not close to expiry. A new certificate is not required."); return(false); }
private static async Task <ResourceConfiguration> GetResourceConfigurationAsync() { var config = new ResourceConfiguration(); ISet <string> hostnamesInternal; switch (_resourceType) { case ResourceType.WebAppSlot: var slot = await _azure.WebApps.ListByResourceGroup(_resourceResGroup).Where(w => w.Name.Equals(_resourceName, StringComparison.CurrentCultureIgnoreCase)).SingleOrDefault().DeploymentSlots.GetByNameAsync(_slotName); hostnamesInternal = slot.HostNames; config.Region = slot.Region; config.Resource = slot; break; case ResourceType.FunctionApp: var functionApp = _azure.AppServices.FunctionApps.ListByResourceGroup(_resourceResGroup).Where(fa => fa.Name.Equals(_resourceName, StringComparison.CurrentCultureIgnoreCase)).SingleOrDefault(); hostnamesInternal = functionApp.HostNames; config.Region = functionApp.Region; config.Resource = functionApp; break; case ResourceType.FunctionAppSlot: var functionAppSlot = await _azure.AppServices.FunctionApps.ListByResourceGroup(_resourceResGroup).Where(fa => fa.Name.Equals(_resourceName, StringComparison.CurrentCultureIgnoreCase)).SingleOrDefault().DeploymentSlots.GetByNameAsync(_slotName); hostnamesInternal = functionAppSlot.HostNames; config.Region = functionAppSlot.Region; config.Resource = functionAppSlot; break; case ResourceType.WebApp: default: var webApp = _azure.WebApps.ListByResourceGroup(_resourceResGroup).Where(w => w.Name.Equals(_resourceName, StringComparison.CurrentCultureIgnoreCase)).SingleOrDefault(); hostnamesInternal = webApp.HostNames; config.Region = webApp.Region; config.Resource = webApp; break; } if (_hostname.StartsWith("*.")) { config.Hostnames.AddRange(hostnamesInternal.Where(h => h.EndsWith($".{_hostnameFriendly}"))); } else { config.Hostnames.Add(_hostname); } //Retrieving old certificate, if any _logger.LogInformation($" Retrieving old certificate, if any"); config.ExistingCertificates = _azure.AppServices.AppServiceCertificates.ListByResourceGroup(_resourcePlanResGroup).Where(c => c.HostNames.Contains(_hostname)).ToList(); _logger.LogInformation($" Found {config.ExistingCertificates.Count()}"); return(config); }