Пример #1
0
        private static async Task BindCertificateToSite(string resourceGroupName, string siteName, string certificateName, string hostName)
        {
            var certificateResponse = await _websiteClient.Certificates.GetWithHttpMessagesAsync(resourceGroupName, certificateName);

            var certificate  = certificateResponse.Body;
            var siteResponse = await _websiteClient.WebApps.GetWithHttpMessagesAsync(resourceGroupName, siteName);

            var site = siteResponse.Body;

            var hst = new HostNameBinding();

            hst.Name     = siteName;
            hst.Name     = $"{siteName}/{hostName}";
            hst.Location = site.Location;

            var doms3 = await _websiteClient.WebApps.CreateOrUpdateHostNameBindingWithHttpMessagesAsync(resourceGroupName, siteName, hostName, hst);


            if (!site.HostNames.Any(h => string.Equals(h, hostName, StringComparison.OrdinalIgnoreCase)))
            {
                site.HostNames.Add(hostName);
            }

            if (site.HostNameSslStates == null)
            {
                site.HostNameSslStates = new List <HostNameSslState>();
            }

            if (!site.HostNameSslStates.Any(s => string.Equals(s.Name, hostName, StringComparison.OrdinalIgnoreCase)))
            {
                site.HostNameSslStates.Add(new HostNameSslState
                {
                    Name       = hostName,
                    Thumbprint = certificate.Thumbprint,
                    SslState   = SslState.SniEnabled,
                    ToUpdate   = true
                });
            }

            await _websiteClient.WebApps.CreateOrUpdateAsync(resourceGroupName, siteName, site);
        }
 public static HostNameBinding CreateOrUpdateSiteHostNameBinding(this IWebAppsOperations webApp,
                                                                 string resourceGroupName, string name, string hostName, HostNameBinding hostNameBinding)
 {
     return(webApp.CreateOrUpdateHostNameBinding(resourceGroupName, name, hostName, hostNameBinding));
 }
Пример #3
0
 public static HostNameBinding CreateOrUpdateSiteOrSlotHostNameBinding(this IWebAppsOperations sites, string resourceGroupName, string webAppName, string siteSlotName, string hostName, HostNameBinding hostNameBinding)
 {
     if (string.IsNullOrEmpty(siteSlotName))
     {
         return(sites.CreateOrUpdateHostNameBinding(resourceGroupName, webAppName, hostName, hostNameBinding));
     }
     else
     {
         return(sites.CreateOrUpdateHostNameBindingSlot(resourceGroupName, webAppName, hostName, hostNameBinding, siteSlotName));
     }
 }
        public static async Task MainAsync(string[] args)
        {
            Console.OutputEncoding = Encoding.UTF8;

            // WebApp Environment
            var WEBSITE_OWNER_NAME     = GetEnvironment("WEBSITE_OWNER_NAME");
            var SUBSCRIPTION_ID        = WEBSITE_OWNER_NAME.Split('+')[0];
            var WEBSITE_RESOURCE_GROUP = GetEnvironment("WEBSITE_RESOURCE_GROUP");
            var WEBSITE_SITE_NAME      = GetEnvironment("WEBSITE_SITE_NAME");

            // AppSettings "CertificationUpdater:xxx"
            var DOMAINS     = AppSettings.CertificateUpdater.Domain.Split(",");
            var KEYVAULT_ID = AppSettings.CertificateUpdater.KeyVaultId;
            var KEYVAULT_CERTIFICATE_NAME = AppSettings.CertificateUpdater.CertificateName;
            var IS_FORCE_UPDATE           = AppSettings.CertificateUpdater.ForceUpdate;

            // Using Managed ID
            var tokenProvider = new AzureServiceTokenProvider();
            var token         = await tokenProvider.GetAccessTokenAsync("https://management.azure.com/");

            var webSiteManagementClient = new WebSiteManagementClient(new TokenCredentials(token))
            {
                SubscriptionId = SUBSCRIPTION_ID
            };

            // Slotは未サポート
            var webSite = webSiteManagementClient.WebApps.Get(WEBSITE_RESOURCE_GROUP, WEBSITE_SITE_NAME);

            if (webSite == null)
            {
                // WEBSITE_SITE_NAMEが何らかの理由で間違えていると、例外にならずnullが返ってくる。(WebApp側が設定するので間違えるはずはないのだけど。)
                // しかし、後続の処理で引っかかるのが嫌なのでチェックする。
                throw new Exception($"Invalid parameters or not found webapp. SubscriptionId='{SUBSCRIPTION_ID}', ResouceGroup='{WEBSITE_RESOURCE_GROUP}', Name='{WEBSITE_SITE_NAME}'");
            }

            foreach (var domain in DOMAINS)
            {
                if (!IS_FORCE_UPDATE && NeedCreateOrUpdate(webSiteManagementClient, WEBSITE_RESOURCE_GROUP, WEBSITE_SITE_NAME, domain))
                {
                    // 更新不要
                    return;
                }

                // KeyVaultへの参照を行い、最新の証明書の情報を得る
                var certificate = webSiteManagementClient.Certificates.CreateOrUpdate(WEBSITE_RESOURCE_GROUP, WEBSITE_SITE_NAME, new Certificate()
                {
                    Location           = webSite.Location,
                    ServerFarmId       = webSite.ServerFarmId,
                    KeyVaultId         = KEYVAULT_ID,
                    KeyVaultSecretName = KEYVAULT_CERTIFICATE_NAME,
                    Password           = "", // TODO: PassPhraseが必要になったら改修する
                });

                // カスタムドメインの作成と証明書の紐づけを兼ねている
                HostNameBinding result = webSiteManagementClient.WebApps.CreateOrUpdateHostNameBinding(WEBSITE_RESOURCE_GROUP, WEBSITE_SITE_NAME, domain, new HostNameBinding()
                {
                    Thumbprint = certificate.Thumbprint,
                    SslState   = SslState.SniEnabled,
                });

                // Done
                Console.WriteLine($"更新しました。domain={domain}, ExpirationDate={certificate.ExpirationDate}, Thumbprint='{result.Thumbprint}'");
            }
        }