コード例 #1
0
        private async Task PersistCertificateAsync(CertificateType persistenceType, IPersistableCertificate certificate,
                                                   IEnumerable <ICertificatePersistenceStrategy> strategies)
        {
            _logger.LogTrace("Persisting {type} certificate through strategies", persistenceType);

            var tasks = strategies.Select(x => x.PersistAsync(persistenceType, certificate));
            await Task.WhenAll(tasks);
        }
コード例 #2
0
        public Task PersistAsync(CertificateType persistenceType, IPersistableCertificate certificate)
        {
            lock (typeof(FileCertificatePersistenceStrategy))
            {
                File.WriteAllBytes(
                    GetCertificatePath(persistenceType),
                    certificate.RawData);
            }

            return(Task.CompletedTask);
        }
        public Task PersistAsync(CertificateType persistenceType, IPersistableCertificate certificate)
        {
            switch (persistenceType)
            {
            case CertificateType.Account:
                _accountCertificate = (IKeyCertificate)certificate;
                break;

            case CertificateType.Site:
                _siteCertificate = certificate;
                break;

            default:
                throw new ArgumentException("Unhandled persistence type", nameof(persistenceType));
            }
            return(Task.CompletedTask);
        }
        public async Task PersistAsync(CertificateType persistenceType, IPersistableCertificate certificate)
        {
            if (certificate.RawData.Length == 0)
            {
                _logger.LogWarning("Tried to persist empty certificate.");
                return;
            }

            if (persistenceType != CertificateType.Site)
            {
                _logger.LogTrace("Skipping certificate persistence because a certificate of type {CertificateType} can't be persisted in Azure.", persistenceType);
                return;
            }

            var domains = _letsEncryptOptions.Domains.ToArray();

            _logger.LogInformation("Creating new Azure certificate of type {CertificateType} and domains {DomainNames}.", persistenceType, String.Join(", ", domains));

            var apps = await _client.WebApps.ListByResourceGroupAsync(_azureOptions.ResourceGroupName);

            var relevantApps = new HashSet <AzureAppInstance>();

            foreach (var app in apps)
            {
                _logger.LogTrace("Checking hostnames of app {AppName} (AppHostNames: {HostNames}) against domains {DomainNames}.", app.Name, app.HostNames, String.Join(", ", domains));

                if (DoDomainsMatch(app.HostNames, domains))
                {
                    _logger.LogTrace("App {AppName} matches a domain", app.Name);

                    relevantApps.Add(new AzureAppInstance(app));
                }

                if (app.DeploymentSlots != null)
                {
                    var slots = await app.DeploymentSlots.ListAsync();

                    foreach (var slot in slots)
                    {
                        _logger.LogTrace(
                            "Checking hostnames of app {AppName}/slot {slot} (AppHostNames: {HostNames}) against domains {Domains}.",
                            app.Name, slot.Name,
                            slot.HostNames, String.Join(", ", domains));

                        if (DoDomainsMatch(slot.HostNames, domains))
                        {
                            _logger.LogTrace("App {AppName}/slot {slot} matches a domain", app.Name, slot.Name);

                            relevantApps.Add(new AzureAppInstance(app, slot));
                        }
                    }
                }
            }

            if (!relevantApps.Any())
            {
                throw new InvalidOperationException(
                          $"Could not find an app that has a hostname created for domains {String.Join(", ", domains)}.");
            }

            var regionName = relevantApps.FirstOrDefault()?.RegionName;

            _logger.LogInformation("Found region name to use to use for new certificate: {RegionName}", regionName);

            IAppServiceCertificate newCertificate = await CreateOrUpdateCertificateAsync(certificate.RawData, regionName);

            foreach (var appTuple in relevantApps)
            {
                await UpdateAppBindingsAsync(appTuple, newCertificate, domains);
            }

            await DeleteOldCertificatesAsync(newCertificate);
        }
 public Task PersistAsync(CertificateType persistenceType, IPersistableCertificate certificate)
 {
     return(persistAsync(persistenceType, certificate.RawData));
 }
コード例 #6
0
        public async Task PersistSiteCertificateAsync(IPersistableCertificate certificate)
        {
            await PersistCertificateAsync(CertificateType.Site, certificate, _certificatePersistenceStrategies);

            _logger.LogInformation("Certificate persisted for later use.");
        }