Example #1
0
        /// <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);
        }
Example #2
0
        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);
        }