在 Azure 中添加或删除 Service Fabric 群集的证书

建议先了解 Service Fabric 使用 X.509 证书的方式,并熟悉群集安全性应用场景。 在继续下一步之前,必须先了解群集证书的定义和用途。

在创建群集期间配置证书安全性时,Service Fabric 允许指定两个群集证书(主要证书和辅助证书)以及客户端证书。 请参阅通过门户创建 Azure 群集通过 Azure Resource Manager 创建 Azure 群集,了解在创建时进行相关设置的详细信息。 如果在创建时只指定了一个群集证书,该证书会用作主证书。 在创建群集后,可以添加一个新证书作为辅助证书。

Note

对于安全群集,始终至少需要部署一个有效的(未吊销或过期)群集证书(主证书或辅助证书),否则,群集无法正常运行。 在所有有效证书过期前的 90 天,系统针对节点生成警告跟踪和警告运行状况事件。 Service Fabric 当前不会针对此文发送电子邮件或其他任何通知。

使用门户添加辅助群集证书

无法通过 Azure 门户使用 Azure powershell 添加辅助群集证书。 本文档稍后将概述该过程。

使用门户交换群集证书

成功部署辅助群集证书之后,如果要交换主要证书和辅助证书,则导航到“安全性”部分,并从上下文菜单中选择“交换主要”选项来交换主要证书和辅助证书。

交换证书

使用门户删除群集证书

对于安全群集,始终至少需要部署一个有效的(未吊销或过期)证书(主证书或辅助证书),否则,群集无法正常运行。

若要删除辅助证书,以防将其用于群集安全,请导航到“安全性”部分,并从辅助证书的上下文菜单中选择“删除”选项。

如果目的是删除标记为主证书的证书,则首先需要将该证书交换为辅助证书,然后在升级完成后删除辅助证书。

使用 Resource Manager Powershell 添加辅助证书

Tip

现在可以使用 Add-AzureRmServiceFabricClusterCertificate cmdlet 更好、更轻松地添加辅助证书。 无需执行本部分中的其余步骤。 此外,使用 Add-AzureRmServiceFabricClusterCertificate cmdlet 时,不需要使用最初用来创建和部署群集的模板。

以下步骤假设读者熟悉 Resource Manager 的工作原理,已使用 Resource Manager 模板至少部署了一个 Service Fabric 群集,并且已准备好用于设置群集的模板。 此外,还有一个前提就是,可以熟练使用 JSON。

Note

如需可参考或入手的示例模板和参数,请从此 git-repo 下载。

编辑 Resource Manager 模板

为了便于参考,示例 5-VM-1-NodeTypes-Secure_Step2.JSON 包含我们要进行的所有编辑。 该示例位于 git-repo

请确保执行所有步骤

  1. 打开用于部署群集的 Resource Manager 模板。 (如果已从上述存储库下载此示例,则使用 5-VM-1-NodeTypes-Secure_Step1.JSON 部署安全群集,并打开该模板)。

  2. 向模板的参数部分添加两个新参数“secCertificateThumbprint”和“secCertificateUrlValue”,类型为“string”。 可复制以下代码片段,并将其添加到该模板。 根据具体的模板源,可能已经存在这些定义,如果是这样,请转至下一步。

       "secCertificateThumbprint": {
          "type": "string",
          "metadata": {
            "description": "Certificate Thumbprint"
          }
        },
        "secCertificateUrlValue": {
          "type": "string",
          "metadata": {
            "description": "Refers to the location URL in your key vault where the certificate was uploaded, it is should be in the format of https://<name of the vault>.vault.azure.cn:443/secrets/<exact location>"
          }
        },
    
  3. Microsoft.ServiceFabric/clusters 资源进行更改 - 在模板中找到“Microsoft.ServiceFabric/clusters”资源定义。 在该定义的属性下,找到“Certificate”JSON 标记,如以下 JSON 代码片段所示:

    "properties": {
        "certificate": {
              "thumbprint": "[parameters('certificateThumbprint')]",
              "x509StoreName": "[parameters('certificateStoreValue')]"
         }
    

    添加新标记“thumbprintSecondary”并为其指定值“[parameters('secCertificateThumbprint')]”。

    资源定义现在应如下所示(根据具体的模板源,有时与下面的代码片段不完全相同)。

    "properties": {
        "certificate": {
              "thumbprint": "[parameters('certificateThumbprint')]",
              "thumbprintSecondary": "[parameters('secCertificateThumbprint')]",
              "x509StoreName": "[parameters('certificateStoreValue')]"
        }
    

    如果要滚动更新证书,请将新证书指定为主要证书,并将当前的主要证书移为辅助证书。 这样就可以通过一个部署步骤,将当前主要证书滚动更新为新证书。

    "properties": {
        "certificate": {
          "thumbprint": "[parameters('secCertificateThumbprint')]",
          "thumbprintSecondary": "[parameters('certificateThumbprint')]",
          "x509StoreName": "[parameters('certificateStoreValue')]"
     }
    
  4. 所有 Microsoft.Compute/virtualMachineScaleSets 资源定义进行更改 - 查找 Microsoft.Compute/virtualMachineScaleSets 资源定义。 滚动到 "publisher": "Microsoft.Azure.ServiceFabric",位于 "virtualMachineProfile" 下。

    在 Service Fabric 发布服务器设置中,应看到类似如下的内容。

    Json_Pub_Setting1

    向其中添加新的证书项

    "certificateSecondary": {
        "thumbprint": "[parameters('secCertificateThumbprint')]",
        "x509StoreName": "[parameters('certificateStoreValue')]"
        }
      },
    

    属性现在应如下所示

    Json_Pub_Setting2

    如果要滚动更新证书,请将新证书指定为主要证书,并将当前的主要证书移为辅助证书。 这样就可以通过一个部署步骤,将当前证书滚动更新为新证书。

    "certificate": {
       "thumbprint": "[parameters('secCertificateThumbprint')]",
       "x509StoreName": "[parameters('certificateStoreValue')]"
         },
    "certificateSecondary": {
        "thumbprint": "[parameters('certificateThumbprint')]",
        "x509StoreName": "[parameters('certificateStoreValue')]"
        }
      },
    

    属性现在应如下所示
    Json_Pub_Setting3

  5. 所有 Microsoft.Compute/virtualMachineScaleSets 资源定义进行更改 - 查找 Microsoft.Compute/virtualMachineScaleSets 资源定义。 滚动到 "vaultCertificates":,位于 "OSProfile" 下。 应该会看到类似下面的屏幕。

    Json_Pub_Setting4

    向其添加 secCertificateUrlValue。 使用以下代码片段:

    {
        "certificateStore": "[parameters('certificateStoreValue')]",
        "certificateUrl": "[parameters('secCertificateUrlValue')]"
    }
    

    现在,生成的 Json 应如下所示。 Json_Pub_Setting5

Note

请确保已对模板中的 Nodetypes/Microsoft.Compute/virtualMachineScaleSets 资源定义重复执行了步骤 4 和 5。 如果缺少其中一个,证书将无法安装在该虚拟机规模集上,并且在群集(包括停止运行的群集)上产生不可预知的结果(如果最终没有群集可用于安全性的有效证书)。 因此在继续之前,请仔细检查。

编辑模板文件,反映前面添加的新参数

如果参考了 git-repo 中的示例,便可开始更改示例 5-VM-1-NodeTypes-Secure.paramters_Step2.JSON

编辑 Resource Manager 模板参数文件,添加 secCertificateThumbprint 和 secCertificateUrlValue 的两个新参数。

    "secCertificateThumbprint": {
      "value": "thumbprint value"
    },
    "secCertificateUrlValue": {
      "value": "Refers to the location URL in your key vault where the certificate was uploaded, it is should be in the format of https://<name of the vault>.vault.azure.cn:443/secrets/<exact location>"
     },

将模板部署到 Azure

  • 现在,可以将模板部署到 Azure。 请打开 Azure PS 版本 1(或更高版本)的命令提示符。
  • 登录到 Azure 帐户,选择特定的 Azure 订阅。 对于有权访问多个 Azure 订阅的用户而言,这是一个重要步骤。
Connect-AzureRmAccount -Environment AzureChinaCloud 
Select-AzureRmSubscription -SubscriptionId <Subcription ID> 

部署模板之前先进行测试。 使用群集当前部署到的同一个资源组。

Test-AzureRmResourceGroupDeployment -ResourceGroupName <Resource Group that your cluster is currently deployed to> -TemplateFile <PathToTemplate>

将模板部署到该资源组。 使用群集当前部署到的同一个资源组。 运行 New-AzureRmResourceGroupDeployment 命令。 无需指定模式,因为默认值为 incremental

Note

如果将 Mode 设置为 Complete,可能会无意中删除不在模板中的资源。 因此请不要在此方案中使用该模式。

New-AzureRmResourceGroupDeployment -Name ExampleDeployment -ResourceGroupName <Resource Group that your cluster is currently deployed to> -TemplateFile <PathToTemplate>

下面是已填充数据的同一个 Powershell 命令示例。

$ResouceGroup2 = "chackosecure5"
$TemplateFile = "C:\GitHub\Service-Fabric\ARM Templates\Cert Rollover Sample\5-VM-1-NodeTypes-Secure_Step2.json"
$TemplateParmFile = "C:\GitHub\Service-Fabric\ARM Templates\Cert Rollover Sample\5-VM-1-NodeTypes-Secure.parameters_Step2.json"

New-AzureRmResourceGroupDeployment -ResourceGroupName $ResouceGroup2 -TemplateParameterFile $TemplateParmFile -TemplateUri $TemplateFile -clusterName $ResouceGroup2

部署完成后,使用新证书连接到群集,并执行一些查询。 如果能够执行这些查询, 则可以删除旧证书。

如果使用自签名证书,请务必将它们导入本地 TrustedPeople 证书存储。

######## Set up the certs on your local box
Import-PfxCertificate -Exportable -CertStoreLocation Cert:\CurrentUser\TrustedPeople -FilePath c:\Mycertificates\chackdanTestCertificate9.pfx -Password (ConvertTo-SecureString -String abcd123 -AsPlainText -Force)
Import-PfxCertificate -Exportable -CertStoreLocation Cert:\CurrentUser\My -FilePath c:\Mycertificates\chackdanTestCertificate9.pfx -Password (ConvertTo-SecureString -String abcd123 -AsPlainText -Force)

以下快速参考提供了用于连接到安全群集的命令

$ClusterName= "chackosecure5.chinanorth.cloudapp.chinacloudapi.cn:19000"
$CertThumbprint= "70EF5E22ADB649799DA3C8B6A6BF7SD1D630F8F3" 

Connect-serviceFabricCluster -ConnectionEndpoint $ClusterName -KeepAliveIntervalInSec 10 `
    -X509Credential `
    -ServerCertThumbprint $CertThumbprint  `
    -FindType FindByThumbprint `
    -FindValue $CertThumbprint `
    -StoreLocation CurrentUser `
    -StoreName My

以下快速参考提供了用于获取群集运行状况的命令

Get-ServiceFabricClusterHealth 

将应用程序证书部署到群集。

可以使用与上述步骤 5 相同的步骤,将证书从 keyvault 部署到节点。 只需定义并使用不同的参数。

添加或删除客户端证书

除群集证书外,还可添加客户端证书来执行 Service Fabric 群集上的管理操作。

可以添加两种类型的客户端证书 - 管理证书或只读证书。 这些证书稍后可用于在群集上控制对管理员操作和查询操作的访问。 默认情况下,群集证书会添加到允许的管理证书列表。

可以指定任意数量的客户端证书。 每次执行添加/删除操作都会导致对 Service Fabric 群集的配置进行更新

通过门户添加管理或只读客户端证书

  1. 导航到“安全性”部分,并选择“安全性”部分顶部的“+ 身份验证”按钮。
  2. 在“添加身份验证”部分中,选择“身份验证类型”-“只读客户端”或“管理员客户端”
  3. 现在选择授权方法。 向 Service Fabric 指出是要使用使用者名称还是指纹来查找此证书。 一般来说,使用使用者名称授权方法并不是一种良好的安全做法。

    添加客户端证书

使用门户删除管理或只读客户端证书

若要删除辅助证书,以防将其用于群集安全,请导航到“安全性”部分,并从特定证书的上下文菜单中选择“删除”选项。

后续步骤

有关群集管理的详细信息,请阅读以下文章: