Partilhar via


Implantar um cluster do Service Fabric que usa o nome comum do certificado em vez da impressão digital

Nenhum certificado pode ter a mesma impressão digital, o que dificulta a substituição ou o gerenciamento de certificados de cluster. Vários certificados, no entanto, podem ter o mesmo nome ou assunto comum. Um cluster usando nomes comuns de certificado torna o gerenciamento de certificados muito mais simples. Este artigo descreve como implantar um cluster do Service Fabric para usar o nome comum do certificado em vez da impressão digital do certificado.

Nota

Recomendamos que utilize o módulo Azure Az do PowerShell para interagir com o Azure. Para começar, consulte Instalar o Azure PowerShell. Para saber como migrar para o módulo do Az PowerShell, veja Migrar o Azure PowerShell do AzureRM para o Az.

Obter um certificado

Primeiro, obtenha um certificado de uma autoridade de certificação (CA). O nome comum do certificado deve ser para o domínio personalizado que você possui e comprou de um registrador de domínios. Por exemplo, "azureservicefabricbestpractices.com"; aqueles que não são funcionários da Microsoft não podem provisionar certificados para domínios MS, portanto, você não pode usar os nomes DNS do seu LB ou Gerenciador de Tráfego como nomes comuns para seu certificado, e precisará provisionar uma Zona DNS do Azure se seu domínio personalizado for resolvível no Azure. Você também desejará declarar seu domínio personalizado como "managementEndpoint" do cluster se quiser que o portal reflita o alias de domínio personalizado do cluster.

Para fins de teste, você pode obter um certificado assinado por CA de uma autoridade de certificação gratuita ou aberta.

Nota

Não há suporte para certificados autoassinados, incluindo aqueles gerados ao implantar um cluster do Service Fabric no portal do Azure.

Carregue o certificado para um cofre de chaves

No Azure, um cluster do Service Fabric é implantado em um conjunto de dimensionamento de máquina virtual. Carregue o certificado para um cofre de chaves. Quando o cluster é implantado, o certificado é instalado no conjunto de escala da máquina virtual em que o cluster está sendo executado.

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    

Baixar e atualizar um modelo de exemplo

Este artigo usa o modelo de exemplo de cluster seguro de 5 nós e os parâmetros do modelo. Transfira os ficheiros azuredeploy.json e azuredeploy.parameters.json para o seu computador.

Atualizar arquivo de parâmetros

Primeiro, abra o arquivo azuredeploy.parameters.json em um editor de texto e adicione o seguinte valor de parâmetro:

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

Em seguida, defina os valores dos parâmetros certificateCommonName, sourceVaultValue e certificateUrlValue como aqueles retornados pelo script anterior:

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

Atualizar o ficheiro de modelo

Em seguida, abra o arquivo azuredeploy.json em um editor de texto e faça três atualizações para dar suporte ao nome comum do certificado.

  1. Na seção de parâmetros, adicione um parâmetro certificateCommonName:

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

    Considere também remover o certificadoImpressão digital, ele pode não ser mais necessário.

  2. Defina o valor da variável sfrpApiVersion como "2018-02-01":

    "sfrpApiVersion": "2018-02-01",
    
  3. No recurso Microsoft.Compute/virtualMachineScaleSets, atualize a extensão da máquina virtual para usar o nome comum nas configurações de certificado em vez da impressão digital. Em virtualMachineProfile-extensionProfile-extensions-properties-settings-certificate>>>>>, adicione

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

    e remover "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. No recurso Microsoft.ServiceFabric/clusters, atualize a versão da API para "2018-02-01". Adicione também uma configuração certificateCommonNames com uma propriedade commonNames e remova a configuração de certificado (com a propriedade thumbprint) como no exemplo a seguir:

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

    Nota

    O campo 'certificateIssuerThumbprint' permite especificar os emitentes esperados de certificados com um determinado nome comum de assunto. Este campo aceita uma enumeração separada por vírgulas de impressões digitais SHA1. Observe que este é um reforço da validação do certificado - no caso em que o emissor não está especificado ou vazio, o certificado será aceito para autenticação se sua cadeia puder ser construída, e termina em uma raiz confiável pelo validador. Se o emissor for especificado, o certificado será aceito se a impressão digital de seu emissor direto corresponder a qualquer um dos valores especificados neste campo - independentemente de a raiz ser confiável ou não. Observe que uma PKI pode usar diferentes autoridades de certificação para emitir certificados para o mesmo assunto, e por isso é importante especificar todas as impressões digitais esperadas do emissor para um determinado assunto.

    A especificação do emitente é considerada uma boa prática; Embora omiti-lo continue a funcionar - para certificados encadeados até uma raiz confiável - esse comportamento tem limitações e pode ser eliminado em um futuro próximo. Observe também que os clusters implantados no Azure e protegidos com certificados X509 emitidos por uma PKI privada e declarados por assunto podem não conseguir ser validados pelo serviço Azure Service Fabric (para comunicação entre clusters), se a Política de Certificados da PKI não for detetável, disponível e acessível.

Implantar o modelo atualizado

Reimplante o modelo atualizado depois de fazer as alterações.

# 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

Próximos passos