Развертывание кластера Service Fabric, использующего вместо отпечатка общее имя сертификата
Два сертификата не могут иметь один и тот же отпечаток. Это затрудняет смену сертификатов кластера и управление им. Тем не менее несколько сертификатов могут иметь одно общее имя или тему. Кластер, использующий общие имена сертификата, упрощает управление сертификатами. В этой статье описывается развертывание кластера Service Fabric для использования общего имени сертификата вместо отпечатка сертификата.
Примечание.
Мы рекомендуем использовать модуль Azure Az PowerShell для взаимодействия с Azure. Сведения о начале работы см. в статье "Установка Azure PowerShell". Дополнительные сведения см. в статье Перенос Azure PowerShell с AzureRM на Az.
Получение сертификата
Сначала получите сертификат в центре сертификации (ЦС). Обычное имя сертификата должно соответствовать вашему личному домену, который вы приобрели у регистратора доменов. Например, "azureservicefabricbestpractices.com"; пользователи, которые не являются сотрудниками корпорации Майкрософт, не могут предоставлять сертификаты для доменов MS. Поэтому вы не можете использовать DNS-имена вашего LB или диспетчер трафика в качестве общих имен для сертификата. Вам необходимо подготовить зону Azure DNS к работе, если ваш личный домен разрешен в Azure. Подробнее см. в статье Tutorial: Host your domain in Azure DNS (Руководство. Размещение домена в Azure DNS). Вы захотите объявить личный домен собственным в качестве "managementEndpoint" кластера, если хотите, чтобы портал отражал псевдоним личного домена для вашего кластера.
В целях тестирования можно получить сертификат, подписанный ЦС, из бесплатного или открытого центра сертификации.
Примечание.
Самозаверяющие сертификаты, включая созданные при развертывании кластера Service Fabric на портале Azure, не поддерживаются.
Отправка сертификата в хранилище ключей
В 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.json и azuredeploy.parameters.json.
Обновление файла параметров
Сначала откройте файл azuredeploy.parameters.json в текстовом редакторе и добавьте следующее значение параметра:
"certificateCommonName": {
"value": "myclustername.southcentralus.cloudapp.azure.com"
},
"certificateIssuerThumbprint": {
"value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
},
Затем задайте для параметров certificateCommonName, sourceVaultValue и certificateUrlValue значения, возвращенные предыдущим скриптом:
"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 в текстовом редакторе и создайте три обновления для поддержки общего имени сертификата.
В разделе параметров добавьте параметр certificateCommonName:
"certificateCommonName": { "type": "string", "metadata": { "description": "Certificate Commonname" } }, "certificateIssuerThumbprint": { "type": "string", "metadata": { "description": "Certificate Authority Issuer Thumpbrint for Commonname cert" } },
Кроме того, рассмотрите возможность удаления certificateThumbprint, так как он больше не понадобится.
Задайте значение "2018-02-01" для переменной sfrpApiVersion:
"sfrpApiVersion": "2018-02-01",
В ресурсе 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" } },
В ресурсе Microsoft.ServiceFabric/clusters обновите версию API до версии "2018-02-01". Кроме того, добавьте параметр certificateCommonNames, свойство commonNames и удалите параметр 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 и защищенные сертификатами X509, которые выданные частной PKI и объявленные субъектом, могут не пройти проверку службой Azure Service Fabric (для обмена данными между кластерами), если политика сертификата PKI не является видимой и доступной.
Развертывание обновленного шаблона
Повторно разверните обновленный шаблон после внесения изменений.
# 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
Следующие шаги
- Дополнительные сведения о безопасности кластеров см. в статье Сценарии защиты кластера Service Fabric.
- Дополнительные сведения о выделении сертификата кластера.
- Обновление сертификатов кластера и управление ими
- Упростите управление сертификатами с помощью Перехода с отпечатка на общее имя сертификата для кластера