部署使用证书公用名称而非指纹的 Service Fabric 群集
两个证书不能具有相同的指纹,具有相同的指纹会使群集证书滚动更新或管理变得困难。 但是,多个证书可以具有相同的公用名称或使用者。 使用证书公用名称会使群集的证书管理更加简单。 本文介绍了如何部署 Service Fabric 群集来使用证书公用名称而非证书指纹。
注意
建议使用 Azure Az PowerShell 模块与 Azure 交互。 若要开始,请参阅安装 Azure PowerShell。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az。
获取证书
首先,从证书颁发机构 (CA) 获取证书
。 证书的公用名称应该是针对你拥有的自定义域,并且是从域注册机构购买的。 例如,“azureservicefabricbestpractices.com”;不是 Azure 员工的用户不能为 MS 域预配证书,因此不能使用 LB 或流量管理器的 DNS 名称作为证书的公用名称,而需预配 Azure DNS 区域(前提是自定义域可以在 Azure 中解析)。 如果希望门户反映群集的自定义域别名,则还需将拥有的自定义域声明为群集的“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
Connect-AzAccount -Environment AzureChinaCloud -SubscriptionId $SubscriptionId
$region = "chinaeast"
$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.json 和 azuredeploy.parameters.json 文件下载到计算机。
更新参数文件
首先,在文本编辑器中打开 azuredeploy.parameters.json 文件并添加以下参数值:
"certificateCommonName": {
"value": "myclustername.chinaeast.cloudapp.chinacloudapi.cn"
},
"certificateIssuerThumbprint": {
"value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
接下来,将 certificateCommonName、sourceVaultValue 和 certificateUrlValue 参数值设置为前面的脚本返回的值:
"certificateCommonName": {
"value": "myclustername.chinaeast.cloudapp.chinacloudapi.cn"
},
"certificateIssuerThumbprint": {
"value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
"sourceVaultValue": {
"value": "/subscriptions/<subscription>/resourceGroups/testvaultgroup/providers/Microsoft.KeyVault/vaults/testvault"
},
"certificateUrlValue": {
"value": "https://testvault.vault.azure.cn:443/secrets/testcert/5c882b7192224447bbaecd5a46962655"
},
更新模板文件
接下来,在文本编辑器中打开 azuredeploy.json 文件并进行三项更新以支持证书公用名称。
在 parameters 部分中,添加 certificateCommonName 参数:
"certificateCommonName": { "type": "string", "metadata": { "description": "Certificate Commonname" } }, "certificateIssuerThumbprint": { "type": "string", "metadata": { "description": "Certificate Authority Issuer Thumpbrint for Commonname cert" } },
另请考虑删除 certificateThumbprint,可能不再需要此项。
将 sfrpApiVersion 变量的值设置为“2018-02-01”:
"sfrpApiVersion": "2018-02-01",
在 Microsoft.Compute/virtualMachineScaleSets 资源中,更新虚拟机扩展以在证书设置中使用公用名称而非指纹。 在“虚拟机配置文件”->“扩展配置文件”->“扩展”->“属性”->“设置”->“证书”中,添加
"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" } },
在 Microsoft.ServiceFabric/clusters 资源中,将 API 版本更新为“2018-02-01”。 另请添加包含 commonNames 属性的 certificateCommonNames 设置,并删除 certificate 设置(包含指纹属性),如以下示例中所示:
{ "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="chinaeast"
$id="<subscription ID"
# Sign in to your Azure account and select your subscription
Connect-AzAccount -Environment AzureChinaCloud -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
后续步骤
- 了解群集安全性。
- 了解如何滚动更新群集证书
- 更新和管理群集证书
- 通过将群集从证书指纹更改为通用名称来简化证书管理