Dela via


Distribuera ett Service Fabric-kluster som använder certifikatets gemensamma namn i stället för tumavtryck

Inga två certifikat kan ha samma tumavtryck, vilket gör det svårt att distribuera eller hantera klustercertifikat. Flera certifikat kan dock ha samma gemensamma namn eller ämne. Ett kluster med hjälp av vanliga certifikatnamn gör certifikathanteringen mycket enklare. Den här artikeln beskriver hur du distribuerar ett Service Fabric-kluster för att använda certifikatets gemensamma namn i stället för certifikatets tumavtryck.

Kommentar

Vi rekommenderar att du använder Azure Az PowerShell-modulen för att interagera med Azure. Information om hur du kommer igång finns i Installera Azure PowerShell. Information om hur du migrerar till Az PowerShell-modulen finns i artikeln om att migrera Azure PowerShell från AzureRM till Az.

Hämta ett certifikat

Hämta först ett certifikat från en certifikatutfärdare (CA).. Certifikatets gemensamma namn ska vara för den anpassade domän som du äger och köpt från en domänregistrator. Till exempel "azureservicefabricbestpractices.com"; de som inte är Microsoft-anställda kan inte etablera certifikat för MS-domäner, så du kan inte använda DNS-namnen för din LB eller Traffic Manager som vanliga namn för ditt certifikat, och du måste etablera en Azure DNS-zon om din anpassade domän ska kunna matchas i Azure. Du vill också deklarera din anpassade domän som ditt klusters "managementEndpoint" om du vill att portalen ska återspegla det anpassade domänaliaset för klustret.

I testsyfte kan du få ett ca-signerat certifikat från en kostnadsfri eller öppen certifikatutfärdare.

Kommentar

Självsignerade certifikat, inklusive de som genereras när du distribuerar ett Service Fabric-kluster i Azure-portalen, stöds inte.

Ladda upp certifikatet till ett nyckelvalv

I Azure distribueras ett Service Fabric-kluster på en VM-skalningsuppsättning. Ladda upp certifikatet till ett nyckelvalv. När klustret distribueras installeras certifikatet på vm-skalningsuppsättningen som klustret körs på.

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    

Ladda ned och uppdatera en exempelmall

I den här artikeln används mallen och mallparametrarna 5 noder för säkra klusterexempel . Ladda ned azuredeploy.json- och azuredeploy.parameters.json-filerna till datorn.

Uppdatera parameterfil

Öppna först filen azuredeploy.parameters.json i en textredigerare och lägg till följande parametervärde:

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

Ange sedan parametervärdena certificateCommonName, sourceVaultValue och certificateUrlValue till värden som returnerades av föregående skript:

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

Uppdatera mallfilen

Öppna sedan filen azuredeploy.json i en textredigerare och gör tre uppdateringar för att stödja certifikatets gemensamma namn.

  1. I avsnittet parametrar lägger du till en certificateCommonName-parameter :

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

    Överväg också att ta bort certifikatetThumbprint. Det kanske inte längre behövs.

  2. Ange värdet för variabeln sfrpApiVersion till "2018-02-01":

    "sfrpApiVersion": "2018-02-01",
    
  3. I resursen Microsoft.Compute/virtualMachineScaleSets uppdaterar du tillägget för virtuella datorer för att använda det gemensamma namnet i certifikatinställningarna i stället för tumavtrycket. I virtualMachineProfile-extensionProfile-extensions-properties-settings-certificate>>>>> lägger du till

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

    och ta bort "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"
            }
          },
    
  4. I resursen Microsoft.ServiceFabric/clusters uppdaterar du API-versionen till "2018-02-01". Lägg också till en certificateCommonNames-inställning med en commonNames-egenskap och ta bort certifikatinställningen (med tumavtrycksegenskapen) som i följande exempel:

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

    Kommentar

    Fältet "certificateIssuerThumbprint" gör det möjligt att ange förväntade utfärdare av certifikat med ett angivet ämnesnamn. Det här fältet accepterar en kommaavgränsad uppräkning av SHA1-tumavtryck. Observera att detta är en förstärkning av certifikatverifieringen – om utfärdaren inte har angetts eller är tom godkänns certifikatet för autentisering om dess kedja kan skapas och hamnar i en rot som är betrodd av validatorn. Om utfärdaren har angetts godkänns certifikatet om tumavtrycket för dess direkta utfärdare matchar något av de värden som anges i det här fältet – oavsett om roten är betrodd eller inte. Observera att en PKI kan använda olika certifikatutfärdare för att utfärda certifikat för samma ämne, och därför är det viktigt att ange alla förväntade tumavtryck för utfärdaren för ett visst ämne.

    Att ange utfärdaren anses vara bästa praxis. Om du utelämnar det fortsätter det att fungera – för certifikat som kedjar ihop till en betrodd rot – har det här beteendet begränsningar och kan fasas ut inom en snar framtid. Observera också att kluster som distribueras i Azure och skyddas med X509-certifikat som utfärdats av en privat PKI och deklarerats av ämne kanske inte kan verifieras av Azure Service Fabric-tjänsten (för kommunikation mellan kluster och tjänster), om PKI:s certifikatprincip inte kan identifieras, vara tillgänglig och tillgänglig.

Distribuera den uppdaterade mallen

Distribuera om den uppdaterade mallen när du har gjort ändringarna.

# 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

Nästa steg