Tutorial: Adicionar um ponto de extremidade HTTPS a um serviço de front-end da API Web ASP.NET Core usando KestrelTutorial: Add an HTTPS endpoint to an ASP.NET Core Web API front-end service using Kestrel

Este tutorial é a terceira parte de uma série.This tutorial is part three of a series. Vai aprender a ativar o HTTPS num serviço ASP.NET Core em execução no Service Fabric.You will learn how to enable HTTPS in an ASP.NET Core service running on Service Fabric. Quando tiver terminado, terá uma aplicação de voto com um front-end Web ASP.NET Core com HTTPS ativado a escutar na porta 443.When you're finished, you have a voting application with an HTTPS-enabled ASP.NET Core web front-end listening on port 443. Se não quiser criar a aplicação de voto manualmente em Criar uma aplicação .NET do Service Fabric, pode transferir o código de origem da aplicação concluída.If you don't want to manually create the voting application in Build a .NET Service Fabric application, you can download the source code for the completed application.

Na terceira parte da série, ficará a saber como:In part three of the series, you learn how to:

  • Definir um ponto final de HTTPS no serviçoDefine an HTTPS endpoint in the service
  • Configurar o Kestrel para utilizar HTTPSConfigure Kestrel to use HTTPS
  • Instalar o certificado SSL nos nós de cluster remotoInstall the SSL certificate on the remote cluster nodes
  • Dar ao SERVIÇO DE REDE acesso à chave privada do certificadoGive NETWORK SERVICE access to the certificate's private key
  • Abrir a porta 443 no Balanceador de Carga do AzureOpen port 443 in the Azure load balancer
  • Implementar a aplicação num cluster remotoDeploy the application to a remote cluster

Nesta série de tutoriais, ficará a saber como:In this tutorial series you learn how to:

Nota

Este artigo foi atualizado para utilizar o novo módulo AZ do Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Pode continuar a utilizar o módulo AzureRM, que continuará a receber correções de erros até, pelo menos, dezembro de 2020.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Para obter mais informações sobre o novo módulo Az e a compatibilidade do AzureRM, veja Apresentação do novo módulo Az do Azure PowerShell.To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Para obter instruções de instalação do módulo Az, veja Instalar o Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Pré-requisitosPrerequisites

Antes de começar este tutorial:Before you begin this tutorial:

Obter um certificado ou criar um certificado de desenvolvimento autoassinadoObtain a certificate or create a self-signed development certificate

Para aplicações de produção, utilize um certificado de uma autoridade de certificação (AC).For production applications, use a certificate from a certificate authority (CA). Para fins de desenvolvimento e teste, pode criar e utilizar um certificado autoassinado.For development and test purposes, you can create and use a self-signed certificate. O SDK do Service Fabric disponibiliza o script CertSetup.ps1, que cria um certificado autoassinado e o importa para o arquivo de certificados Cert:\LocalMachine\My.The Service Fabric SDK provides the CertSetup.ps1 script, which creates a self-signed certificate and imports it into the Cert:\LocalMachine\My certificate store. Abra um prompt de comando como administrador e execute o comando a seguir para criar um certificado com o assunto "CN = MyTestCert":Open a command prompt as administrator and run the following command to create a cert with the subject "CN=mytestcert":

PS C:\program files\microsoft sdks\service fabric\clustersetup\secure> .\CertSetup.ps1 -Install -CertSubjectName CN=mytestcert

Se já tiver um ficheiro PFX de certificado, execute o seguinte para importá-lo para o arquivo de certificados Cert:\LocalMachine\My:If you already have a certificate PFX file, run the following to import the certificate into the Cert:\LocalMachine\My certificate store:


PS C:\mycertificates> Import-PfxCertificate -FilePath .\mysslcertificate.pfx -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString "!Passw0rd321" -AsPlainText -Force)


   PSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\My

Thumbprint                                Subject
----------                                -------
3B138D84C077C292579BA35E4410634E164075CD  CN=zwin7fh14scd.westus.cloudapp.azure.com

Definir um ponto final de HTTPS no manifesto de serviçoDefine an HTTPS endpoint in the service manifest

Inicie o Visual Studio como administrador e abra a solução Voting.Launch Visual Studio as an administrator and open the Voting solution. No Explorador de Soluções, abra VotingWeb/PackageRoot/ServiceManifest.xml.In Solution Explorer, open VotingWeb/PackageRoot/ServiceManifest.xml. O manifesto do serviço declara os pontos finais do serviço.The service manifest defines the service endpoints. Localize a secção Pontos finais e edite o ponto final "ServiceEndpoint" existente.Find the Endpoints section and edit the existing "ServiceEndpoint" endpoint. Mude o nome para "EndpointHttps", defina o protocolo como https, o tipo como Input e a porta como a 443.Change the name to "EndpointHttps", set the protocol to https, the type to Input, and port to 443. Guarde as alterações.Save your changes.

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="VotingWebPkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="https://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="VotingWebType" />
  </ServiceTypes>

  <CodePackage Name="Code" Version="1.0.0">
    <EntryPoint>
      <ExeHost>
        <Program>VotingWeb.exe</Program>
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </EntryPoint>
  </CodePackage>

  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <Endpoint Protocol="https" Name="EndpointHttps" Type="Input" Port="443" />
    </Endpoints>
  </Resources>
</ServiceManifest>

Configurar o Kestrel para utilizar HTTPSConfigure Kestrel to use HTTPS

No Explorador de Soluções, abra o ficheiro VotingWeb/VotingWeb.cs.In Solution Explorer, open the VotingWeb/VotingWeb.cs file. Configure o Kestrel para utilizar HTTPS e procure o certificado no arquivo Cert:\LocalMachine\My.Configure Kestrel to use HTTPS and lookup the certificate in the Cert:\LocalMachine\My store. Utilize instruções para adicionar o seguinte:Add the following using statements:

using System.Net;
using Microsoft.Extensions.Configuration;
using System.Security.Cryptography.X509Certificates;

Atualize ServiceInstanceListener para utilizar o ponto final EndpointHttps novo e escutar na porta 443.Update the ServiceInstanceListener to use the new EndpointHttps endpoint and listen on port 443. Quando configurar o anfitrião da Web para utilizar o servidor Kestrel, tem de configurar o Kestrel para escutar os endereços IPv6 em todas as interfaces de rede: opt.Listen(IPAddress.IPv6Any, port, listenOptions => {...}.When configuring the web host to use Kestrel server, you must configure Kestrel to listen for IPv6 addresses on all network interfaces: opt.Listen(IPAddress.IPv6Any, port, listenOptions => {...}.

new ServiceInstanceListener(
serviceContext =>
    new KestrelCommunicationListener(
        serviceContext,
        "EndpointHttps",
        (url, listener) =>
        {
            ServiceEventSource.Current.ServiceMessage(serviceContext, $"Starting Kestrel on {url}");

            return new WebHostBuilder()
                .UseKestrel(opt =>
                {
                    int port = serviceContext.CodePackageActivationContext.GetEndpoint("EndpointHttps").Port;
                    opt.Listen(IPAddress.IPv6Any, port, listenOptions =>
                    {
                        listenOptions.UseHttps(GetHttpsCertificateFromStore());
                        listenOptions.NoDelay = true;
                    });
                })
                .ConfigureAppConfiguration((builderContext, config) =>
                {
                    config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);
                })

                .ConfigureServices(
                    services => services
                        .AddSingleton<HttpClient>(new HttpClient())
                        .AddSingleton<FabricClient>(new FabricClient())
                        .AddSingleton<StatelessServiceContext>(serviceContext))
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<Startup>()
                .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                .UseUrls(url)
                .Build();
        }))

Adicione também o seguinte método para que esse Kestrel possa encontrar o certificado no arquivo Cert:\LocalMachine\My pelo requerente.Also add the following method so that Kestrel can find the certificate in the Cert:\LocalMachine\My store using the subject.

Substitua "<your_CN_value>" por "MyTestCert" se você tiver criado um certificado autoassinado com o comando anterior do PowerShell ou usar o CN do seu certificado.Replace "<your_CN_value>" with "mytestcert" if you created a self-signed certificate with the previous PowerShell command, or use the CN of your certificate. Lembre localhost -se de que, no caso da implantação local, é preferível usar "CN = localhost" para evitar exceções de autenticação.Be aware that in the case of local deployment to localhost it's preferable to use "CN=localhost" to avoid authentication exceptions.

private X509Certificate2 GetHttpsCertificateFromStore()
{
    using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
    {
        store.Open(OpenFlags.ReadOnly);
        var certCollection = store.Certificates;
        var currentCerts = certCollection.Find(X509FindType.FindBySubjectDistinguishedName, "CN=<your_CN_value>", false);
        
        if (currentCerts.Count == 0)
                {
                    throw new Exception("Https certificate is not found.");
                }
        
        return currentCerts[0];
    }
}

Dar ao SERVIÇO DE REDE acesso à chave privada do certificadoGive NETWORK SERVICE access to the certificate's private key

Num passo anterior, importou o certificado para o arquivo Cert:\LocalMachine\My no computador de desenvolvimento.In a previous step, you imported the certificate into the Cert:\LocalMachine\My store on the development computer. Agora, conceda explicitamente à conta que está executando o serviço (serviço de rede, por padrão) acesso à chave privada do certificado.Now, explicitly give the account running the service (NETWORK SERVICE, by default) access to the certificate's private key. Você pode fazer essa etapa manualmente (usando a ferramenta certlm. msc), mas é melhor executar automaticamente um script do PowerShell Configurando um script de inicialização no SetupEntryPoint do manifesto do serviço.You can do this step manually (using the certlm.msc tool), but it's better to automatically run a PowerShell script by configuring a startup script in the SetupEntryPoint of the service manifest.

Configurar o ponto de entrada da configuração do serviçoConfigure the service setup entry point

No Explorador de Soluções, abra VotingWeb/PackageRoot/ServiceManifest.xml.In Solution Explorer, open VotingWeb/PackageRoot/ServiceManifest.xml. Na secção CodePackage, adicione o nó SetupEntryPoint node e, em seguida, o nó ExeHost.In the CodePackage section, add SetupEntryPoint node and then a ExeHost node. Em ExeHost, defina Program como "Setup.bat" e WorkingFolder como "CodePackage".In ExeHost, set Program to "Setup.bat" and WorkingFolder to "CodePackage". Quando inicia o serviço VotingWeb, o script Setup.bat é executado na pasta CodePackage antes de VotingWeb.exe ser iniciado.When the VotingWeb service starts, the Setup.bat script executes in the CodePackage folder before VotingWeb.exe starts.

<?xml version="1.0" encoding="utf-8"?>
<ServiceManifest Name="VotingWebPkg"
                 Version="1.0.0"
                 xmlns="http://schemas.microsoft.com/2011/01/fabric"
                 xmlns:xsd="https://www.w3.org/2001/XMLSchema"
                 xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <ServiceTypes>
    <StatelessServiceType ServiceTypeName="VotingWebType" />
  </ServiceTypes>

  <CodePackage Name="Code" Version="1.0.0">
    <SetupEntryPoint>
      <ExeHost>
        <Program>Setup.bat</Program>
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </SetupEntryPoint>

    <EntryPoint>
      <ExeHost>
        <Program>VotingWeb.exe</Program>
        <WorkingFolder>CodePackage</WorkingFolder>
      </ExeHost>
    </EntryPoint>
  </CodePackage>

  <ConfigPackage Name="Config" Version="1.0.0" />

  <Resources>
    <Endpoints>
      <Endpoint Protocol="https" Name="EndpointHttps" Type="Input" Port="443" />
    </Endpoints>
  </Resources>
</ServiceManifest>

Adicionar os scripts de batch e do PowerShellAdd the batch and PowerShell setup scripts

Para executar o PowerShell no ponto SetupEntryPoint, pode executar PowerShell.exe num ficheiro de batch que aponte para um ficheiro do PowerShell.To run PowerShell from the SetupEntryPoint point, you can run PowerShell.exe in a batch file that points to a PowerShell file. Primeiro, adicione o ficheiro de batch ao projeto do serviço.First, add the batch file the service project. No Explorador de Soluções, clique com o botão direito do rato em VotingWeb e selecione Add (Adicionar)->New Item (Novo Item) e adicione um ficheiro novo com o nome "Setup.bat".In Solution Explorer, right-click VotingWeb and select Add->New Item and add a new file named "Setup.bat". Edite o ficheiro Setup.bat e adicione o seguinte comando:Edit the Setup.bat file and add the following command:

powershell.exe -ExecutionPolicy Bypass -Command ".\SetCertAccess.ps1"

Modifique as propriedades do ficheiro Setup.bat para definir Copy to Output Directory (Copiar para Diretório de Saída) como "Copy if newer" (“Copiar se for mais recente”).Modify the Setup.bat file properties to set Copy to Output Directory to "Copy if newer".

Definir as propriedades do ficheiro

No Explorador de Soluções, clique com o botão direito do rato em VotingWeb e selecione Add->New Item e adicione um ficheiro novo com o nome "SetCertAccess.ps1".In Solution Explorer, right-click VotingWeb and select Add->New Item and add a new file named "SetCertAccess.ps1". Edite o ficheiro SetCertAccess.ps1 e adicione o seguinte script:Edit the SetCertAccess.ps1 file and add the following script:

$subject="mytestcert"
$userGroup="NETWORK SERVICE"

Write-Host "Checking permissions to certificate $subject.." -ForegroundColor DarkCyan

$cert = (gci Cert:\LocalMachine\My\ | where { $_.Subject.Contains($subject) })[-1]

if ($cert -eq $null)
{
    $message="Certificate with subject:"+$subject+" does not exist at Cert:\LocalMachine\My\"
    Write-Host $message -ForegroundColor Red
    exit 1;
}elseif($cert.HasPrivateKey -eq $false){
    $message="Certificate with subject:"+$subject+" does not have a private key"
    Write-Host $message -ForegroundColor Red
    exit 1;
}else
{
    $keyName=$cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName

    $keyPath = "C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\"
    $fullPath=$keyPath+$keyName
    $acl=(Get-Item $fullPath).GetAccessControl('Access')


    $hasPermissionsAlready = ($acl.Access | where {$_.IdentityReference.Value.Contains($userGroup.ToUpperInvariant()) -and $_.FileSystemRights -eq [System.Security.AccessControl.FileSystemRights]::FullControl}).Count -eq 1

    if ($hasPermissionsAlready){
        Write-Host "Account $userGroup already has permissions to certificate '$subject'." -ForegroundColor Green
        return $false;
    } else {
        Write-Host "Need add permissions to '$subject' certificate..." -ForegroundColor DarkYellow

        $permission=$userGroup,"Full","Allow"
        $accessRule=new-object System.Security.AccessControl.FileSystemAccessRule $permission
        $acl.AddAccessRule($accessRule)
        Set-Acl $fullPath $acl

        Write-Output "Permissions were added"

        return $true;
    }
}

Modifique as propriedades do ficheiro SetCertAccess.ps1 para definir Copiar para Diretório de Saída como “Copiar se for mais recente”.Modify the SetCertAccess.ps1 file properties to set Copy to Output Directory to "Copy if newer".

Executar o script de configuração como administrador localRun the setup script as a local administrator

Por predefinição, o executável do ponto de entrada da configuração do serviço é executado com as mesmas credenciais do Service Fabric (normalmente, a conta NetworkService).By default, the service setup entry point executable runs under the same credentials as Service Fabric (typically the NetworkService account). SetCertAccess.ps1 requer privilégios de administrador.The SetCertAccess.ps1 requires administrator privileges. No manifesto da aplicação, pode alterar as permissões de segurança para executar o script de arranque com uma conta de administrador local.In the application manifest, you can change the security permissions to run the startup script under a local administrator account.

No Explorador de Soluções, abra Voting/ApplicationPackageRoot/ApplicationManifest.xml.In Solution Explorer, open Voting/ApplicationPackageRoot/ApplicationManifest.xml. Primeiro, crie uma secção Principals e adicione um utilizador novo (por exemplo, "SetupAdminUser").First, create a Principals section and add a new user (for example, "SetupAdminUser". Adicione a conta de utilizador SetupAdminUser ao grupo Administradores do sistema.Add the SetupAdminUser user account to the Administrators system group. Depois, na secção VotingWebPkg ServiceManifestImport, configure uma política RunAsPolicy para aplicar o principal SetupAdminUser ao ponto de entrada da configuração.Next, in the VotingWebPkg ServiceManifestImport section, configure a RunAsPolicy to apply the SetupAdminUser principal to the setup entry point. Esta política indica ao Service Fabric que o ficheiro Setup.bat é executado como SetupAdminUser (com privilégios de administrador).This policy tells Service Fabric that the Setup.bat file runs as SetupAdminUser (with administrator privileges).

<?xml version="1.0" encoding="utf-8"?>
<ApplicationManifest xmlns:xsd="https://www.w3.org/2001/XMLSchema" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" ApplicationTypeName="VotingType" ApplicationTypeVersion="1.0.0" xmlns="http://schemas.microsoft.com/2011/01/fabric">
  <Parameters>
    <Parameter Name="VotingData_MinReplicaSetSize" DefaultValue="3" />
    <Parameter Name="VotingData_PartitionCount" DefaultValue="1" />
    <Parameter Name="VotingData_TargetReplicaSetSize" DefaultValue="3" />
    <Parameter Name="VotingWeb_InstanceCount" DefaultValue="-1" />
  </Parameters>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="VotingDataPkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
  </ServiceManifestImport>
  <ServiceManifestImport>
    <ServiceManifestRef ServiceManifestName="VotingWebPkg" ServiceManifestVersion="1.0.0" />
    <ConfigOverrides />
    <Policies>
      <RunAsPolicy CodePackageRef="Code" UserRef="SetupAdminUser" EntryPointType="Setup" />
    </Policies>
  </ServiceManifestImport>
  <DefaultServices>
    <Service Name="VotingData">
      <StatefulService ServiceTypeName="VotingDataType" TargetReplicaSetSize="[VotingData_TargetReplicaSetSize]" MinReplicaSetSize="[VotingData_MinReplicaSetSize]">
        <UniformInt64Partition PartitionCount="[VotingData_PartitionCount]" LowKey="0" HighKey="25" />
      </StatefulService>
    </Service>
    <Service Name="VotingWeb" ServicePackageActivationMode="ExclusiveProcess">
      <StatelessService ServiceTypeName="VotingWebType" InstanceCount="[VotingWeb_InstanceCount]">
        <SingletonPartition />
      </StatelessService>
    </Service>
  </DefaultServices>
  <Principals>
    <Users>
      <User Name="SetupAdminUser">
        <MemberOf>
          <SystemGroup Name="Administrators" />
        </MemberOf>
      </User>
    </Users>
  </Principals>
</ApplicationManifest>

Executar a aplicação localmenteRun the application locally

Em Gerenciador de soluções, selecione o aplicativo de votação e defina a propriedade URL do aplicativo como "/https:/localhost: 443".In Solution Explorer, select the Voting application and set the Application URL property to "https://localhost:443".

Guarde todos os ficheiros e prima F5 para executar a aplicação localmente.Save all files and hit F5 to run the application locally. Depois que o aplicativo é implantado, um navegador da Web/é aberto para https:/localhost: 443.After the application deploys, a web browser opens to https://localhost:443. Se estiver a utilizar um certificado autoassinado, verá um aviso se o PC não confiar na segurança deste site.If you are using a self-signed certificate, you see a warning that your PC doesn't trust this website's security. Avance para a página Web.Continue on to the web page.

Aplicação Voting

Instalar o certificado nos nós de cluster remotoInstall certificate on cluster nodes

Antes de implantar o aplicativo no Azure, instale o certificado no Cert:\LocalMachine\My repositório de todos os nós de cluster remotos.Before deploying the application to the Azure, install the certificate into the Cert:\LocalMachine\My store of all the remote cluster nodes. Os serviços podem ser movidos para diferentes nós do cluster.Services can move to different nodes of the cluster. Quando o serviço Web de front-end é iniciado num nó de cluster, o script de arranque irá procurar o certificado e configurar as permissões de acesso.When the front-end web service starts on a cluster node, the startup script will lookup the certificate and configure access permissions.

Em primeiro lugar, exporte o certificado para um ficheiro PFX.First, export the certificate to a PFX file. Abra a aplicação certlm.msc e navegue para Personal (Pessoal) >Certificates (Certificados).Open the certlm.msc application and navigate to Personal>Certificates. Clique com o botão direito do mouse no certificado MyTestCert e selecione todas as tarefas>Exportar.Right-click on the mytestcert certificate, and select All Tasks>Export.

Exportar o certificado

No assistente de exportação, escolha Yes, export the private key (Sim, exportar a chave privada) e escolha o formato Personal Information Exchange (PFX).In the export wizard, choose Yes, export the private key and choose the Personal Information Exchange (PFX) format. Exporte o ficheiro para C:\Users\sfuser\votingappcert.pfx.Export the file to C:\Users\sfuser\votingappcert.pfx.

Em seguida, instale o certificado no cluster remoto usando o cmdlet Add-AzServiceFabricApplicationCertificate .Next, install the certificate on the remote cluster using the Add-AzServiceFabricApplicationCertificate cmdlet.

Aviso

Para as aplicações de desenvolvimento e teste, basta um certificado autoassinado.A self-signed certificate is sufficient for development and testing applications. Para aplicações de produção, utilize um certificado de uma autoridade de certificação (AC) em vez de um autoassinado.For production applications, use a certificate from a certificate authority (CA) instead of a self-signed certificate.

Connect-AzAccount

$vaultname="sftestvault"
$certname="VotingAppPFX"
$certpw="!Password321#"
$groupname="voting_RG"
$clustername = "votinghttps"
$ExistingPfxFilePath="C:\Users\sfuser\votingappcert.pfx"

$appcertpwd = ConvertTo-SecureString -String $certpw -AsPlainText -Force

Write-Host "Reading pfx file from $ExistingPfxFilePath"
$cert = new-object System.Security.Cryptography.X509Certificates.X509Certificate2 $ExistingPfxFilePath, $certpw

$bytes = [System.IO.File]::ReadAllBytes($ExistingPfxFilePath)
$base64 = [System.Convert]::ToBase64String($bytes)

$jsonBlob = @{
   data = $base64
   dataType = 'pfx'
   password = $certpw
   } | ConvertTo-Json

$contentbytes = [System.Text.Encoding]::UTF8.GetBytes($jsonBlob)
$content = [System.Convert]::ToBase64String($contentbytes)

$secretValue = ConvertTo-SecureString -String $content -AsPlainText -Force

# Upload the certificate to the key vault as a secret
Write-Host "Writing secret to $certname in vault $vaultname"
$secret = Set-AzureKeyVaultSecret -VaultName $vaultname -Name $certname -SecretValue $secretValue

# Add a certificate to all the VMs in the cluster.
Add-AzServiceFabricApplicationCertificate -ResourceGroupName $groupname -Name $clustername -SecretIdentifier $secret.Id -Verbose

Abrir a porta 443 no Balanceador de Carga do AzureOpen port 443 in the Azure load balancer

Abra a porta 443 no balanceador de carga, se ainda não estiver aberta.Open port 443 in the load balancer if it isn't already.

$probename = "AppPortProbe6"
$rulename="AppPortLBRule6"
$RGname="voting_RG"
$port=443

# Get the load balancer resource
$resource = Get-AzResource | Where {$_.ResourceGroupName –eq $RGname -and $_.ResourceType -eq "Microsoft.Network/loadBalancers"}
$slb = Get-AzLoadBalancer -Name $resource.Name -ResourceGroupName $RGname

# Add a new probe configuration to the load balancer
$slb | Add-AzLoadBalancerProbeConfig -Name $probename -Protocol Tcp -Port $port -IntervalInSeconds 15 -ProbeCount 2

# Add rule configuration to the load balancer
$probe = Get-AzLoadBalancerProbeConfig -Name $probename -LoadBalancer $slb
$slb | Add-AzLoadBalancerRuleConfig -Name $rulename -BackendAddressPool $slb.BackendAddressPools[0] -FrontendIpConfiguration $slb.FrontendIpConfigurations[0] -Probe $probe -Protocol Tcp -FrontendPort $port -BackendPort $port

# Set the goal state for the load balancer
$slb | Set-AzLoadBalancer

Implementar a aplicação no AzureDeploy the application to Azure

Guarde todos os ficheiros, mude de Debug para Release e prima F6 para recompilar.Save all files, switch from Debug to Release, and hit F6 to rebuild. No Explorador de Soluções, clique com o botão direito do rato em Voting e selecione Publish (Publicar).In Solution Explorer, right-click on Voting and select Publish. Selecione o ponto final da ligação do cluster criado em Implementar uma aplicação num cluster ou selecione outro cluster.Select the connection endpoint of the cluster created in Deploy an application to a cluster, or select another cluster. Clique em Publish para publicar a aplicação no cluster remoto.Click Publish to publish the application to the remote cluster.

Quando a aplicação estiver implementada, abra um browser e navegue para https://mycluster.region.cloudapp.azure.com:443 (atualize o URL com o ponto final da ligação do cluster).When the application deploys, open a web browser and navigate to https://mycluster.region.cloudapp.azure.com:443 (update the URL with the connection endpoint for your cluster). Se estiver a utilizar um certificado autoassinado, verá um aviso se o PC não confiar na segurança deste site.If you are using a self-signed certificate, you see a warning that your PC doesn't trust this website's security. Avance para a página Web.Continue on to the web page.

Aplicação Voting

Passos seguintesNext steps

Nesta parte do tutorial, ficou a saber como:In this part of the tutorial, you learned how to:

  • Definir um ponto final de HTTPS no serviçoDefine an HTTPS endpoint in the service
  • Configurar o Kestrel para utilizar HTTPSConfigure Kestrel to use HTTPS
  • Instalar o certificado SSL nos nós de cluster remotoInstall the SSL certificate on the remote cluster nodes
  • Dar ao SERVIÇO DE REDE acesso à chave privada do certificadoGive NETWORK SERVICE access to the certificate's private key
  • Abrir a porta 443 no Balanceador de Carga do AzureOpen port 443 in the Azure load balancer
  • Implementar a aplicação num cluster remotoDeploy the application to a remote cluster

Avance para o tutorial seguinte:Advance to the next tutorial: