Отсутствие сертификата кластера приводит к сбою Add-AzServiceFabricClusterCertificate: ссылка на объект не установлена ​​для экземпляра объекта - PullRequest
0 голосов
/ 27 апреля 2020

Я довольно новичок в Service Fabri c, поэтому я не уверен, является ли это проблемой с командлетом или это ошибка с моей стороны. Я использую модуль Az.ServiceFabri c версии 2.0.2 и модуль Az версии 3.8.0.

Я пытаюсь использовать командлет Add-AzServiceFabricClusterCertificate для добавления вторичного сертификата, который я уже создал в моем Azure KeyVault к моему кластеру. Когда я запускаю командлет, он выходит из строя с этой ошибкой (запуск с Debug дал мне больше деталей стека):

DEBUG: AzureQoSEvent: CommandName - Add-AzServiceFabricClusterCertificate; IsSuccess - False; Duration -
00:00:07.3059582;; Exception - System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.Azure.Commands.ServiceFabric.Commands.ServiceFabricClusterCmdlet.GetClusterType(Cluster
clusterResource)
   at Microsoft.Azure.Commands.ServiceFabric.Commands.AddAzureRmServiceFabricClusterCertificate.ExecuteCmdlet()
   at Microsoft.WindowsAzure.Commands.Utilities.Common.AzurePSCmdlet.ProcessRecord();

Глядя на код для этого командлета, я заметил, что он, вероятно, дает сбой, потому что ресурс кластера, который передается в GetClusterType не имеет своего члена Certificate, поэтому он завершается ошибкой при попытке проверить Certificate.Thumbprint и Certificate.ThumbprintSecondary:

        internal ClusterType GetClusterType(Cluster clusterResource)
        {
            if (string.IsNullOrWhiteSpace(clusterResource.Certificate.Thumbprint) &&
                string.IsNullOrWhiteSpace(clusterResource.Certificate.ThumbprintSecondary))
            {
                return ClusterType.Unsecure;
            }
            else
            {
                return ClusterType.Secure;
            }
        }

Кластер, который передается в GetClusterType, получается таким же образом как и в командлете Get-AzServiceFabricCluster, поэтому, когда я запускаю этот командлет для кластера, к которому пытаюсь добавить сертификат, я заметил, что мое поле «Сертификат» пусто в ответе. Я предполагаю, что именно это вызывает исключение NullRef. Вот этот соответствующий фрагмент:

          AzureActiveDirectory :
              TenantId : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
              ClusterApplication : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
              ClientApplication : xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
          Certificate :
          CertificateCommonNames : Microsoft.Azure.Management.ServiceFabric.Models.ServerCertificateCommonNames
          ClientCertificateCommonNames :
          ClientCertificateThumbprints :

Мне интересно, ожидается ли, что поле Certificate будет пустым, когда я использую командлет Get-AzServiceFabricCluster, и действительно ли это является причиной моего Add-AzServiceFabricClusterCertificate? Сбой в командлете. Когда я смотрю на блейд Security кластера в Azure Portal, я вижу сертификат первичного кластера, с которым я изначально создал кластер, и это сертификат, который я использую при развертывании и выполнении других операций кластера. Однако я заметил, что поле отпечатка сертификата пусто при просмотре сертификата с портала. Я ожидаю увидеть этот сертификат при использовании Get-AzServiceFabricCluster, но он пуст. Этот сертификат отсутствует в моем командлете Get-AzServiceFabricCluster, который можно исправить через портал или другой командлет?

1 Ответ

0 голосов
/ 27 апреля 2020

Похоже, ваш кластер настроен на поиск сертификатов по общему имени, а не по отпечатку. Я предполагаю, что это основано на том факте, что ваш портал не показывает отпечаток пальца против сертификата, в дополнение к опубликованному вами фрагменту.

В этом случае обновлять конфигурацию кластера не нужно. с новым сертификатом по истечении срока действия старого сертификата. Вместо этого вам нужно установить сертификат только в ваше хранилище VMSS . После добавления нового сертификата в VMSS Service Fabri c автоматически использует более поздний истекающий сертификат .

Вы всегда должны убедиться, что на VMSS установлен хотя бы один действительный сертификат с общим именем, настроенным в кластере.

PS для загрузки сертификата KV и установки на VMSS:

$subscriptionId  = "sub-id"
$vmssResourceGroupName     = "vmss-rg-name"
$vmssName                  = "vmss-name"
$vaultName                 = "kv-name"
$primaryCertName           = "kv-cert-name"
$certFilePath              = "...\.pfx"
$certPassword              = ConvertTo-SecureString -String "password" -AsPlainText -Force

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

# Update primary certificate within the Key Vault
$primary = Import-AzKeyVaultCertificate `
    -VaultName $vaultName `
    -Name $primaryCertName `
    -FilePath $certFilePath `
    -Password $certPassword

$certConfig = New-AzVmssVaultCertificateConfig -CertificateUrl $primary.SecretId -CertificateStore "My"

# Get VM scale set 
$vmss = Get-AzVmss -ResourceGroupName $vmssResourceGroupName -VMScaleSetName $vmssName

# Add new certificate version
$vmss.VirtualMachineProfile.OsProfile.Secrets[0].VaultCertificates.Add($certConfig)

# Update the VM scale set 
Update-AzVmss -ResourceGroupName $vmssResourceGroupName -Verbose `
    -Name $vmssName -VirtualMachineScaleSet $vmss

Для получения дополнительной информации я написал сообщение в блоге о переключении с отпечатка пальца на общее имя.

Официальные документы также являются хорошим справочным материалом.

...