共用方式為


部署使用憑證通用名稱 (而非指紋) 的 Service Fabric 叢集

由於憑證的指紋皆不相同,導致叢集憑證變換或管理變成艱難的任務。 然而,不同的憑證卻能擁有相同的通用名稱或主體。 使用憑證通用名稱的叢集能大幅簡化憑證管理工作的難度。 本文章描述如何部署 Service Fabric 叢集才能使用憑證通用名稱,而非憑證指紋。

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 若要開始使用,請參閱安裝 Azure PowerShell (部分機器翻譯)。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

取得憑證

首先,請向憑證授權單位 (CA) 索取憑證。 憑證的一般名稱應該用於您擁有的自訂網域,並且向網域註冊機構購買。 例如,"azureservicefabricbestpractices.com";並非 Microsoft 員工的人員法佈建 MS 網域的憑證,因此您無法使用您的 LB 或流量管理員本身的 DNS 名稱作為您的憑證一般名稱,而且,如果您的自訂網域可以在 Azure 中解析,您必須佈建 Azure DNS 區域。 如果您想要入口網站反映叢集的自訂網域別名,您也需要宣告您擁有的自訂網域成為叢集的 “managementEndpoint”。

基於測試目的,您可以向免費或開放的憑證授權單位索取 CA 簽署憑證。

注意

至於自我簽署憑證,包括在 Azure 入口網站中部署 Service Fabric 叢集時產生的憑證則不受支援。

將憑證上傳到金鑰保存庫

在 Azure 中,Service Fabric 叢集會部署在虛擬機器擴展集上。 將憑證上傳到金鑰保存庫。 部署叢集時,憑證會安裝在叢集執行所在的虛擬機器擴展集上。

Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Scope CurrentUser -Force

$SubscriptionId  =  "<subscription ID>"

# Sign in to your Azure account and select your subscription
Login-AzAccount -SubscriptionId $SubscriptionId

$region = "southcentralus"
$KeyVaultResourceGroupName  = "mykeyvaultgroup"
$VaultName = "mykeyvault"
$certFilename = "C:\users\sfuser\myclustercert.pfx"
$certname = "myclustercert"
$Password  = "P@ssw0rd!123"

# Create new Resource Group 
New-AzResourceGroup -Name $KeyVaultResourceGroupName -Location $region

# Create the new key vault
$newKeyVault = New-AzKeyVault -VaultName $VaultName -ResourceGroupName $KeyVaultResourceGroupName -Location $region -EnabledForDeployment 
$resourceId = $newKeyVault.ResourceId 

# Add the certificate to the key vault.
$PasswordSec = ConvertTo-SecureString -String $Password -AsPlainText -Force
$KVSecret = Import-AzKeyVaultCertificate -VaultName $vaultName -Name $certName  -FilePath $certFilename -Password $PasswordSec

$CertificateThumbprint = $KVSecret.Thumbprint
$CertificateURL = $KVSecret.SecretId
$SourceVault = $resourceId
$CommName    = $KVSecret.Certificate.SubjectName.Name

Write-Host "CertificateThumbprint    :"  $CertificateThumbprint
Write-Host "CertificateURL           :"  $CertificateURL
Write-Host "SourceVault              :"  $SourceVault
Write-Host "Common Name              :"  $CommName    

下載及更新範例範本

本文章使用 5 節點安全叢集範例範本和範本參數。 將 azuredeploy.jsonazuredeploy.parameters.json 檔案下載到電腦。

更新參數檔案

首先,請在文字編輯器中開啟 azuredeploy.parameters.json 檔案,然後新增以下參數值:

"certificateCommonName": {
    "value": "myclustername.southcentralus.cloudapp.azure.com"
},
"certificateIssuerThumbprint": {
    "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},

接著,將 certificateCommonNamesourceVaultValuecertificateUrlValue 參數值設定為前述指令碼傳回的值:

"certificateCommonName": {
    "value": "myclustername.southcentralus.cloudapp.azure.com"
},
"certificateIssuerThumbprint": {
    "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
"sourceVaultValue": {
  "value": "/subscriptions/<subscription>/resourceGroups/testvaultgroup/providers/Microsoft.KeyVault/vaults/testvault"
},
"certificateUrlValue": {
  "value": "https://testvault.vault.azure.net:443/secrets/testcert/5c882b7192224447bbaecd5a46962655"
},

更新範本檔案

接下來,在文字編輯器中開啟 azuredeploy.json 檔案,然後更新三個項目以支援憑證通用名稱。

  1. parameters 區段,新增 certificateCommonName 參數:

    "certificateCommonName": {
      "type": "string",
      "metadata": {
        "description": "Certificate Commonname"
      }
    },
    "certificateIssuerThumbprint": {
      "type": "string",
      "metadata": {
        "description": "Certificate Authority Issuer Thumpbrint for Commonname cert"
      }
    },
    

    另外,請考慮移除 certificateThumbprint,因為我們不再需要它了。

  2. sfrpApiVersion 變數的值設定為 "2018-02-01":

    "sfrpApiVersion": "2018-02-01",
    
  3. Microsoft.Compute/virtualMachineScaleSets 資源中,更新虛擬機器擴充功能以在憑證設定中使用通用名稱,而非使用指紋。 在 virtualMachineProfile->extensionProfile->extensions->properties->settings->certificate 中,新增

       "commonNames": [
        "[parameters('certificateCommonName')]"
       ],
    

    並移除 "thumbprint": "[parameters('certificateThumbprint')]",

    "virtualMachineProfile": {
      "extensionProfile": {
        "extensions": [
          {
            "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]",
            "properties": {
              "type": "ServiceFabricNode",
              "autoUpgradeMinorVersion": true,
              "protectedSettings": {
                "StorageAccountKey1": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key1]",
                "StorageAccountKey2": "[listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('supportLogStorageAccountName')),'2015-05-01-preview').key2]"
              },
              "publisher": "Microsoft.Azure.ServiceFabric",
              "settings": {
                "clusterEndpoint": "[reference(parameters('clusterName')).clusterEndpoint]",
                "nodeTypeRef": "[variables('vmNodeType0Name')]",
                "dataPath": "D:\\SvcFab",
                "durabilityLevel": "Bronze",
                "enableParallelJobs": true,
                "nicPrefixOverride": "[variables('subnet0Prefix')]",
                "certificate": {
                  "commonNames": [
                     "[parameters('certificateCommonName')]"
                  ],
                  "x509StoreName": "[parameters('certificateStoreValue')]"
                }
              },
              "typeHandlerVersion": "1.0"
            }
          },
    
  4. Microsoft.ServiceFabric/clusters 資源中,將 API 版本更新為 "2018-02-01"。 另外,新增 certificateCommonNames 設定並使用 commonNames 屬性,同時移除 certificate 設定 (使用 thumbprint 屬性),如以下範例所示:

    {
        "apiVersion": "2018-02-01",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        "dependsOn": [
        "[concat('Microsoft.Storage/storageAccounts/', variables('supportLogStorageAccountName'))]"
        ],
        "properties": {
        "addonFeatures": [
            "DnsService",
            "RepairManager"
        ],        
        "certificateCommonNames": {
            "commonNames": [
            {
                "certificateCommonName": "[parameters('certificateCommonName')]",
                "certificateIssuerThumbprint": "[parameters('certificateIssuerThumbprint')]"
            }
            ],
            "x509StoreName": "[parameters('certificateStoreValue')]"
        },
        ...
    

    注意

    [certificateIssuerThumbprint] 欄位允許搭配指定的主體一般名稱來指定預期的憑證簽發者。 此欄位會接受以逗號分隔的 SHA1 指紋列舉。 請注意,這是對憑證驗證的強化;在未指定簽發者或簽發者為空白的情況下,若憑證的鏈結可以建置,且會落在受驗證者信任的根目錄下,系統將會接受該憑證。 若指定簽發者,在憑證直接簽發者的指紋符合此欄位中所指定之任何值的情況下 (無論根目錄是否被信任),系統將會接受該憑證。 請注意,PKI 可能會使用不同的憑證授權單位來為相同的主體簽發憑證,因此請務必針對指定主體指定所有預期的簽發者指紋。

    指定簽發者是最佳的做法;雖然省略它仍然可以運作 (針對鏈結至受信任根目錄的憑證),此行為仍具有限制,並可能會在不久的將來被移除。 此外,請注意到在 Azure 中部署、受到由私人 PKI 簽發的 X509 憑證所保護,並由主體所宣告的叢集,在該 PKI 的憑證原則不可探索、不可用且不可存取的情況下,該叢集可能會無法由 Azure Service Fabric 服務進行驗證 (針對叢集對服務通訊)。

部署更新的範本

完成變更之後,重新部署更新的範本。

# Variables.
$groupname = "testclustergroup"
$clusterloc="southcentralus"  
$id="<subscription ID"

# Sign in to your Azure account and select your subscription
Login-AzAccount -SubscriptionId $id 

# Create a new resource group and deploy the cluster.
New-AzResourceGroup -Name $groupname -Location $clusterloc

New-AzResourceGroupDeployment -ResourceGroupName $groupname -TemplateParameterFile "C:\temp\cluster\AzureDeploy.Parameters.json" -TemplateFile "C:\temp\cluster\AzureDeploy.json" -Verbose

下一步