共用方式為


將叢集憑證從以指紋為基礎的宣告轉換為一般名稱

憑證的簽章 (通常稱為指紋) 是唯一的。 依指紋宣告的叢集憑證會參考憑證的特定執行個體。 此明確性會使得憑證變換和一般的管理既困難且明確。 每項變更都需要協調叢集和基礎運算主機的升級。

將 Azure Service Fabric 叢集的憑證宣告,從以指紋為基礎轉換為以憑證的主體一般名稱 (CN) 為基礎的憑證宣告可大幅簡化管理。 尤其是,變換憑證不再需要叢集升級。 本文描述如何將現有的叢集轉換為以 CN 為基礎的宣告,而不需要停機。

注意

建議您使用 Azure Az PowerShell 模組來與 Azure 互動。 請參閱安裝 Azure PowerShell 以開始使用。 若要了解如何移轉至 Az PowerShell 模組,請參閱將 Azure PowerShell 從 AzureRM 移轉至 Az

移至憑證授權單位單位簽署的憑證

其憑證依指紋宣告的叢集的安全性,憑藉著要將具有相同簽章的憑證偽造成另一個憑證而不可能或計算上不可行的事實。 在此情況下,憑證的來源較不重要,因此自我簽署憑證即已足夠。

相反地,其憑證是由 CN 流量宣告的叢集的安全性,則來自叢集擁有者在其憑證提供者中具有的隱含信任。 提供者是發行憑證的公開金鑰基礎結構 (PKI) 服務。 在其他因素當中,信任是以 PKI 的憑證實務為基礎,其作業安全性是否經過其他受信任方稽核及核准等等。

叢集擁有者也必須詳細了解發出其憑證的憑證授權單位 (CA),因為這是依主體驗證憑證的基本層面。 這也表示自我簽署憑證完全不適合此用途。 基本上任何人都可以產生具有指定主體的憑證。

在下列情況下,CN 所宣告的憑證通常會被視為有效:

  • 其鏈結可以成功建立。
  • 主體具有預期的 CN 元素。
  • 其簽發者 (在鏈結中的直接上層或更高) 受到執行驗證的代理程式信任。

Service Fabric 支援以兩種方式透過 CN 宣告憑證:

  • 使用隱含簽發者,其表示鏈結結尾必須為信任錨點。
  • 具有依指紋宣告的簽發者,稱為簽發者鎖定。

如需詳細資訊,請參閱以名稱為基礎的一般憑證驗證宣告

若要將使用依憑證指紋宣告的自我簽署憑證的叢集轉換為 CN,必須先依指紋將目標 CA 簽署的憑證引進到叢集。 只有這樣才能從指紋轉換成 CN。

基於測試目的,CN 可以宣告自我簽署的憑證,但只有在簽發者已鎖定到其自己的指紋時才可以。 從安全性的觀點來看,此動作幾乎等同於依指紋宣告相同的憑證。 此類型的成功轉換並不保證可成功地從指紋轉換為使用 CA 簽署憑證的 CN。 建議您使用適當 CA 簽署的憑證來測試轉換。 此測試有免費的選項。

上傳憑證並安裝在擴展集

在 Azure 中,用於取得和佈建憑證的建議機制包含 Azure Key Vault 和其工具。 符合叢集憑證宣告的憑證,必須佈建至組成叢集的虛擬機器擴展集的每個節點。 如需詳細資訊,請參閱虛擬機器擴展集上的秘密

在叢集的憑證宣告中進行變更之前,務必在叢集的每個節點類型的虛擬機器上安裝目前的和目標叢集憑證。 從憑證發佈到佈建至 Service Fabric 節點的旅程,將在憑證的旅程中深入討論。

讓叢集進入最佳的開始狀態

將憑證宣告從以指紋為基礎轉換為以 CN 為基礎的影響:

  • 叢集中的每個節點如何尋找並將其認證出示給其他節點。
  • 每個節點在建立安全連線時,如何驗證其對應項目的認證。

繼續之前,請先檢閱這兩個設定的呈現與驗證規則。 執行指紋到 CN 轉換時,最重要的考量是升級和尚未升級的節點 (也就是屬於不同升級網域的節點),必須能夠在升級期間隨時執行成功的相互驗證。 要達到此行為所建議的方法,是在初始升級中依指紋宣告目標或目標憑證。 然後完成轉換至 CN 是後續的動作。 如果叢集已處於建議的開始狀態,您可以略過本節。

轉換有多個有效的開始狀態。 不變的是在升級為 CN 開始時,叢集已在使用目標憑證 (依指紋宣告)。 我們在本文中考慮 GoalCertOldCert1OldCert2

有效的開始狀態

  • Thumbprint: GoalCert, ThumbprintSecondary: None
  • Thumbprint: GoalCert, ThumbprintSecondary: OldCert1,其中 GoalCertNotBefore 日期晚於 OldCert1
  • Thumbprint: OldCert1, ThumbprintSecondary: GoalCert,其中 GoalCertNotBefore 日期晚於 OldCert1

注意

在版本 7.2.445 (7.2 CU4) 之前,Service Fabric 會選取到期最遠的憑證 (具有的 'NotAfter' 屬性最遠),因此以上早於 7.2 CU4 的開始狀態需要 GoalCert 具有晚於 OldCert1NotAfter 日期

如果您的叢集不是先前所述的其中一個有效狀態,請參閱本文結尾一節中有關達到該狀態的資訊。

選取需要的以 CN 為基礎的憑證驗證配置

如先前所述,Service Fabric 支援透過具有隱含信賴錨點或是具有明確鎖定簽發者指紋的 CN 宣告憑證。 如需詳細資訊,請參閱以名稱為基礎的一般憑證驗證宣告

確保您已充分了解這些差異,以及選擇任一機制的含意。 在語法上,此差異或選擇取決於 certificateIssuerThumbprintList 參數的值。 空白表示依賴於信任的根 CA (信賴錨點),而一組指紋則會限制叢集憑證允許的直接簽發者。

注意

certificateIssuerThumbprint 欄位可讓您指定主體 CN 宣告的憑證的預期直接簽發者。 可接受的值為一或多個以逗點分隔的 SHA1 指紋。 此動作會增強憑證驗證。

如果未指定簽發者或清單是空的,則會接受憑證以進行驗證 (如果可以建立憑證鏈結)。 接著憑證會在驗證程式信任的根目錄中。 如果指定了一或多個簽發者指紋,當其直接簽發者的指紋 (從鏈結中擷取) 符合此欄位中指定的任何值時,就會接受憑證。 無論根是否受信任,都會接受憑證。

PKI 可能會使用不同的憑證授權單位單位 (也稱為簽發者) 來簽署具有指定主體的憑證。 基於此理由,請務必為該主體指定所有預期的簽發者指紋。 換句話說,憑證的更新並不保證是由與要更新的憑證相同的簽發者所簽署。

指定簽發者被視為最佳做法。 略過簽發者將可繼續用於鏈結至受根信任的憑證,但此行為有一些限制,可能會在不久的將來淘汰。 在 Azure 中部署的叢集,會使用私人 PKI 所發行的 X509 憑證來保護,而且可能無法由 Service Fabric 驗證 (針對叢集對服務通訊)。 驗證需要 PKI 的憑證原則可供探索、可用且可供存取。

更新叢集的 Azure Resource Manager 範本並部署

使用 Azure Resource Manager (ARM) 範本管理您的 Service Fabric 叢集。 另一個方法是使用 JSON 成品,也就是 Azure 資源總管 (預覽)。 Azure 入口網站目前無法使用同等的體驗。

如果與現有叢集對應的原始範本無法使用,則可以在 Azure 入口網站中取得同等的範本。 移至包含叢集的資源群組,然後從左側的 [自動化] 功能表選取 [匯出範本]。 然後選取您想要的資源。 至少應該分別匯出虛擬機器擴展集和叢集資源。 也可以下載產生的範本。 此範本在完整部署之前可能需要進行變更。 該範本也可能完全不符合原始範本。 它會反映叢集資源的目前狀態。

必要的變更如下所示:

  • 更新 Service Fabric 節點擴充功能 (虛擬機器資源下) 的定義。 如果叢集定義了多個節點類型,您必須更新每個對應虛擬機器擴展集的定義。
  • 更新叢集資源定義。

這裡包含詳細的範例。

更新虛擬機器擴展集資源

從:

"virtualMachineProfile": {
        "extensionProfile": {
            "extensions": [
                {
                    "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]",
                    "properties": {
                        "type": "ServiceFabricNode",
                        "autoUpgradeMinorVersion": true,
                        "protectedSettings": {
                            ...
                        },
                        "publisher": "Microsoft.Azure.ServiceFabric",
                        "settings": {
                            ...
                            "certificate": {
                                "thumbprint": "[parameters('certificateThumbprint')]",
                                "x509StoreName": "[parameters('certificateStoreValue')]"
                            }
                        },
                        ...
                    }
                },

變更為:

"virtualMachineProfile": {
        "extensionProfile": {
            "extensions": [
                {
                    "name": "[concat('ServiceFabricNodeVmExt','_vmNodeType0Name')]",
                    "properties": {
                        "type": "ServiceFabricNode",
                        "autoUpgradeMinorVersion": true,
                        "protectedSettings": {
                            ...
                        },
                        "publisher": "Microsoft.Azure.ServiceFabric",
                        "settings": {
                            ...
                            "certificate": {
                                "commonNames": [
                                    "[parameters('certificateCommonName')]"
                                ],
                                "x509StoreName": "[parameters('certificateStoreValue')]"
                            }
                        },
                        ...
                    }
                },

更新叢集資源

Microsoft.ServiceFabric/clusters 叢集資源中,新增具有 commonNames 設定的 certificateCommonNames 屬性,並完全移除 certificate 屬性 (其所有設定)。

從:

    {
        "apiVersion": "2018-02-01",
        "type": "Microsoft.ServiceFabric/clusters",
        "name": "[parameters('clusterName')]",
        "location": "[parameters('clusterLocation')]",
        "dependsOn": [
            ...
        ],
        "properties": {
            "addonFeatures": [
                ...
            ],
            "certificate": {
              "thumbprint": "[parameters('certificateThumbprint')]",
              "x509StoreName": "[parameters('certificateStoreValue')]"
            },
        ...

變更為:

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

如需詳細資訊,請參閱部署使用憑證通用名稱 (而非指紋) 的 Service Fabric 叢集

部署更新的範本

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

$groupname = "sfclustertutorialgroup"

New-AzResourceGroupDeployment -ResourceGroupName $groupname -Verbose `
    -TemplateParameterFile "C:\temp\cluster\parameters.json" -TemplateFile "C:\temp\cluster\template.json" 

達成將叢集轉換為以 CN 為基礎的憑證宣告的有效開始狀態

開始狀態 升級 1 升級 2
Thumbprint: OldCert1, ThumbprintSecondary: NoneGoalCertNotBefore 日期晚於 OldCert1 Thumbprint: OldCert1, ThumbprintSecondary: GoalCert -
Thumbprint: OldCert1, ThumbprintSecondary: NoneOldCert1NotBefore 日期晚於 GoalCert Thumbprint: GoalCert, ThumbprintSecondary: OldCert1 Thumbprint: GoalCert, ThumbprintSecondary: None
Thumbprint: OldCert1, ThumbprintSecondary: GoalCert,其中 OldCert1NotBefore 日期晚於 GoalCert 升級至 Thumbprint: GoalCert, ThumbprintSecondary: None -
Thumbprint: GoalCert, ThumbprintSecondary: OldCert1,其中 OldCert1NotBefore 日期晚於 GoalCert 升級至 Thumbprint: GoalCert, ThumbprintSecondary: None -
Thumbprint: OldCert1, ThumbprintSecondary: OldCert2 移除 OldCert1OldCert2 其中一個以進入狀態 Thumbprint: OldCertx, ThumbprintSecondary: None 從新的開始狀態繼續

注意

若為版本 7.2.445 (7.2 CU4) 之前版本上的叢集,請將 NotBefore 取代為上述狀態中的 NotAfter

如需如何執行任何這些升級的指示,請參閱管理 Azure Service Fabric叢集中的憑證

下一步