c# - azure sdk 将证书链接到新资源组

标签 c# azure ssl sdk certificate

我正在从 ARM 模板迁移到 C# Azure SDK 部署选项,但在将现有证书的使用转换为新资源组时遇到问题。 我有一个 SSL 证书存储在特定的资源组和 Keyvault 中。 我将 3 个环境放入使用此证书(webapps ssl 绑定(bind))的 ARM 模板创建的其他 3 个资源组中。 当我从 Azure 门户进入我的证书时,我可以看到私有(private)证书链接到我的 3 个资源组

这 block JSON 将 ssl 证书导入到新资源组中

{
      "type": "Microsoft.Web/certificates",
      "name": "MyCert",
      "apiVersion": "2016-03-01",
      "location": "[variables('Location')]",
      "properties": {
        "keyVaultId": "[parameters('keyvaultId')]",
        "keyVaultSecretName": "[parameters('KeyvaultSecretName')]",
        "thumbprint": "[parameters('certThumbprint')]"
      },
      "dependsOn": [
        "[concat('Microsoft.Web/serverfarms/', variables('WebAppAppPlanName'))]"
      ],
    },

使用此 json block 通过其指纹创建 ssl 绑定(bind):

{
      "name": "[concat(variables('WebAppName'),'/',variables('subDomain'), '.domain.fr')]",
      "apiVersion": "2016-08-01",
      "type": "Microsoft.Web/sites/hostNameBindings",
      "location": "[variables('Location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites', variables('WebAppName'))]"
      ],
      "tags": {
        "displayName": "HostName"
      },
      "properties": {
        "siteName": "[variables('WebAppName')]",
        "customHostNameDnsRecordType": "CName",
        "hostNameType": "Verified",
        "sslState": "SniEnabled",
        "thumbprint": "[reference(resourceId('Microsoft.Web/certificates', 'CertName')).Thumbprint]"
      }
    },

现在我尝试使用 Azure SDK 创建同样的东西:

 webApp = webApp.Update()
                  .DefineHostnameBinding()
                  .WithThirdPartyDomain(domain)
                  .WithSubDomain(subdomain)
                  .WithDnsRecordType(CustomHostNameDnsRecordType.CName)
                  .Attach()
                  .Apply();

            webApp = webApp.Update()
                        .WithThirdPartyHostnameBinding(domain, subdomain)
                        .DefineSslBinding()
                            .ForHostname(hostName)
                            .WithExistingCertificate(certificateThumbPrint)
                            .WithSniBasedSsl()
                            .Attach()
                        .Apply();

此代码不起作用,因为在我新创建的资源组中找不到certificateThumbprint。 缺少的相当于将我的证书链接到我的资源组的第一个 json block 。 使用 Azure 门户并手动执行此操作称为“导入应用服务证书”

如何使用 C# 中的 azure SDK 以编程方式将现有应用服务证书导入到新资源组中?

最佳答案

尝试将现有证书从 key 保管库导入到应用服务时,您需要首先将 key 保管库证书添加/链接到资源组。

To do this with Azure REST API

使用旧版 Azure SDK ( Microsoft.Azure.Management.WebSites ) 时,有一个可用的 BeginCreateOrUpdateCertificate 类来执行此操作。但微软不建议使用它,因为它可能很快就会被弃用。

使用 Azure Fluent SDK - 我们无法使用默认的应用程序证书管理类来实现此目的。 “Microsoft.Azure.Management.Fluent.Azure.AppServices.AppServiceCertificates.Define()”。

但是,“Microsoft.Azure.Management.ResourceManager.Fluent.Core”命名空间中有一个名为 RestClient 的类,该类旨在手动调用 azure API。我们可以利用WebSiteManagementClient它使用 RestClient 对 Web 应用程序资源进行 REST API 调用。

var restClient = Microsoft.Azure.Management.ResourceManager.Fluent.Core.RestClient.Configure().WithEnvironment(AzureEnvironment.AzureGlobalCloud).WithCredentials(credentials).Build();
        
        
var x = new WebSiteManagementClient(restClient);
x.SubscriptionId = "your-subscription-id";
var result = x.Certificates.CreateOrUpdateAsync(resourceGroupName, "UploadTest", new CertificateInner("your certificate-location (East-US)",
                        "certificate-password (pass string.Empty if null)",                            
                        keyVaultId: "/subscriptions/your-subscription-id/resourcegroups/your-resourcegroup-id/providers/microsoft.keyvault/vaults/your-key-vault-id",
                        keyVaultSecretName: "key-vault-secretname", hostNames: new List<string>() { "hostname" })).GetAwaiter().GetResult();

这会将 key 保管库中的现有证书添加/链接到资源组,并且可供应用服务使用。

关于c# - azure sdk 将证书链接到新资源组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56146265/

相关文章:

c# - 在 Roslyn 中自动加载 .csx

azure - PowerShell Azure Functions $TriggerMetadata 方法是 GET 但应该是 POST

azure - 无法查找 github.com(端口 9418)(不知道这样的主机)

java - 在服务器客户端条件下使用 USB 驱动程序签署 PDF

c# - 防止 Json.NET 将字符串数组反序列化为键值对数组

c# - <identity impersonate ="true"/>的正确使用

Azure ML Web 服务 - 响应时间慢

php - 如何在 Apache 上设置 2 个虚拟主机,其中一个主机使用 SSL 运行而其他主机不使用?

java - 使用 STARTTLS : recv failed 将套接字升级到 SSLSocket

c# - 下载动态文件