Udostępnij za pośrednictwem


Wdrażanie klastra usługi Service Fabric używającego nazwy pospolitej certyfikatu zamiast odcisku palca

Żadne dwa certyfikaty nie mogą mieć tego samego odcisku palca, co sprawia, że przerzucanie certyfikatów klastra lub zarządzanie nim jest trudne. Jednak wiele certyfikatów może mieć taką samą nazwę pospolitą lub podmiot. Klaster korzystający z nazw pospolitych certyfikatów sprawia, że zarządzanie certyfikatami jest znacznie prostsze. W tym artykule opisano sposób wdrażania klastra usługi Service Fabric w celu używania nazwy pospolitej certyfikatu zamiast odcisku palca certyfikatu.

Uwaga

Do interakcji z platformą Azure zalecamy używanie modułu Azure Az w programie PowerShell. Aby rozpocząć, zobacz Instalowanie programu Azure PowerShell. Aby dowiedzieć się, jak przeprowadzić migrację do modułu Az PowerShell, zobacz Migracja programu Azure PowerShell z modułu AzureRM do modułu Az.

Uzyskiwanie certyfikatu

Najpierw uzyskaj certyfikat z urzędu certyfikacji. Nazwa pospolita certyfikatu powinna być nazwą domeny niestandardowej, którą jesteś właścicielem, i kupioną od rejestratora domen. Na przykład "azureservicefabricbestpractices.com"; tych, którzy nie są pracownikami firmy Microsoft, nie mogą aprowizować certyfikatów dla domen MS, więc nie można używać nazw DNS modułu równoważenia obciążenia lub usługi Traffic Manager jako nazw pospolitych dla certyfikatu i należy aprowizować strefę DNS platformy Azure, jeśli domena niestandardowa będzie rozpoznawalna na platformie Azure. Chcesz również zadeklarować własną domenę niestandardową jako "managementEndpoint" klastra, jeśli chcesz, aby portal odzwierciedlał alias domeny niestandardowej dla klastra.

W celach testowych można uzyskać podpisany certyfikat urzędu certyfikacji z bezpłatnego lub otwartego urzędu certyfikacji.

Uwaga

Certyfikaty z podpisem własnym, w tym certyfikaty generowane podczas wdrażania klastra usługi Service Fabric w witrynie Azure Portal, nie są obsługiwane.

Przekazywanie certyfikatu do magazynu kluczy

Na platformie Azure klaster usługi Service Fabric jest wdrażany w zestawie skalowania maszyn wirtualnych. Przekaż certyfikat do magazynu kluczy. Po wdrożeniu klastra certyfikat jest instalowany w zestawie skalowania maszyn wirtualnych uruchomionym w klastrze.

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    

Pobieranie i aktualizowanie przykładowego szablonu

W tym artykule użyto przykładowego szablonu i parametrów szablonu bezpiecznego klastra z 5 węzłami. Pobierz pliki azuredeploy.json i azuredeploy.parameters.json na komputer.

Aktualizowanie pliku parametrów

Najpierw otwórz plik azuredeploy.parameters.json w edytorze tekstów i dodaj następującą wartość parametru:

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

Następnie ustaw wartości parametrów certificateCommonName, sourceVaultValue i certificateUrlValue na zwracane przez poprzedni skrypt:

"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"
},

Aktualizowanie pliku szablonu

Następnie otwórz plik azuredeploy.json w edytorze tekstów i wprowadź trzy aktualizacje w celu obsługi nazwy pospolitej certyfikatu.

  1. W sekcji parameters dodaj parametr certificateCommonName:

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

    Rozważ również usunięcie certyfikatuThumbprint, ale może już nie być potrzebne.

  2. Ustaw wartość zmiennej sfrpApiVersion na "2018-02-01":

    "sfrpApiVersion": "2018-02-01",
    
  3. W zasobie Microsoft.Compute/virtualMachineScaleSets zaktualizuj rozszerzenie maszyny wirtualnej, aby użyć nazwy pospolitej w ustawieniach certyfikatu zamiast odcisku palca. W pliku virtualMachineProfile-extensionProfile-extensions-properties-settings-certificate>>>>> dodaj

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

    i usuń "thumbprint": "[parameters('certificateThumbprint')]",element .

    "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. W zasobie Microsoft.ServiceFabric/clusters zaktualizuj wersję interfejsu API do "2018-02-01". Dodaj również ustawienie certificateCommonNames z właściwością commonNames i usuń ustawienie certyfikatu (z właściwością odcisku palca), jak w poniższym przykładzie:

    {
        "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')]"
        },
        ...
    

    Uwaga

    Pole "certificateIssuerThumbprint" umożliwia określenie oczekiwanych wystawców certyfikatów z daną nazwą pospolitą podmiotu. To pole akceptuje rozdzielane przecinkami wyliczenie odcisków palca SHA1. Należy pamiętać, że jest to wzmocnienie weryfikacji certyfikatu — w przypadku, gdy wystawca nie zostanie określony lub pusty, certyfikat zostanie zaakceptowany do uwierzytelniania, jeśli jego łańcuch może zostać skompilowany, i kończy się w katalogu głównym zaufanym przez moduł sprawdzania poprawności. Jeśli wystawca zostanie określony, certyfikat zostanie zaakceptowany, jeśli odcisk palca jego wystawcy bezpośredniego jest zgodny z dowolną wartością określoną w tym polu — niezależnie od tego, czy katalog główny jest zaufany, czy nie. Należy pamiętać, że infrastruktura kluczy publicznych może używać różnych urzędów certyfikacji do wystawiania certyfikatów dla tego samego podmiotu, dlatego ważne jest, aby określić wszystkie oczekiwane odciski palca wystawcy dla danego podmiotu.

    Określenie wystawcy jest uznawane za najlepsze rozwiązanie; pomijając, że nadal będzie działać — w przypadku certyfikatów łączących się z zaufanym katalogiem głównym — to zachowanie ma ograniczenia i może zostać wycofane w najbliższej przyszłości. Należy również pamiętać, że klastry wdrożone na platformie Azure i zabezpieczone za pomocą certyfikatów X509 wystawionych przez prywatną infrastrukturę kluczy publicznych i zadeklarowane przez podmiot mogą nie być w stanie zostać zweryfikowane przez usługę Azure Service Fabric (na potrzeby komunikacji między klastrami), jeśli zasady certyfikatów infrastruktury kluczy publicznych nie są wykrywalne, dostępne i dostępne.

Wdrażanie zaktualizowanego szablonu

Ponownie wdróż zaktualizowany szablon po wprowadzeniu zmian.

# 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

Następne kroki