Megosztás a következőn keresztül:


Oktatóanyag: HTTPS-végpont hozzáadása Service Fabric-alkalmazásokhoz a Kestrel használatával

Ez az oktatóanyag egy sorozat harmadik része. Megtudhatja, hogyan vehet fel HTTPS-végpontot az Azure Service Fabricben futó ASP.NET Core szolgáltatásban. Ha végzett, egy olyan szavazóalkalmazással rendelkezik, amely https-kompatibilis ASP.NET Core webes előtérrel rendelkezik, amely a 443-as porton figyel. Ha nem szeretné manuálisan létrehozni a szavazóalkalmazást az oktatóanyag-sorozat első részében, letöltheti a forráskódot a befejezett alkalmazás lekéréséhez.

Ebben az oktatóanyagban az alábbiakkal fog megismerkedni:

  • HTTPS-végpont meghatározása a szolgáltatásban
  • A Kestrel beállítása HTTPS használatára
  • A TLS/SSL-tanúsítvány telepítése a távoli fürtcsomópontokra
  • A NetworkService hozzáférésének biztosítása a tanúsítvány titkos kulcsához
  • A 443-as port megnyitása az Azure Load Balancerben
  • Az alkalmazás üzembe helyezése egy távoli fürtön

Az oktatóanyag-sorozat bemutatja, hogyan:

Feljegyzés

Javasoljuk, hogy az Azure Az PowerShell modult használja az Azure-ral való interakcióhoz. Első lépésként tekintse meg az Azure PowerShell telepítését ismertető témakört. Az Az PowerShell-modulra történő migrálás részleteiről lásd: Az Azure PowerShell migrálása az AzureRM modulból az Az modulba.

Előfeltételek

Az oktatóanyag elkezdése előtt:

Tanúsítvány lekérése vagy önaláírt fejlesztési tanúsítvány létrehozása

Éles alkalmazásokhoz használjon hitelesítésszolgáltatói (CA-) tanúsítványt. Fejlesztési és tesztelési célok érdekében létrehozhat és használhat önaláírt tanúsítványt. A Service Fabric SDK tartalmazza a CertSetup.ps1 szkriptet. A szkript létrehoz egy önaláírt tanúsítványt, és importálja azt a Tanúsítvány:\LocalMachine\Saját tanúsítványtárolóba. Nyisson meg egy parancssori ablakot rendszergazdaként, és futtassa a következő parancsot a "CN=mytestcert" tulajdonosú tanúsítvány létrehozásához:

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

Ha már rendelkezik egy tanúsítvány személyes adatcsere (PFX) fájllal, futtassa a következőt a tanúsítvány importálásához a Tanúsítvány:\LocalMachine\Saját tanúsítványtárolóba:


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

HTTPS-végpont meghatározása a szolgáltatásjegyzékben

Nyissa meg a Visual Studiót a Futtatás rendszergazdaként lehetőséggel, majd nyissa meg a Szavazó megoldást. A Megoldáskezelőben nyissa meg a következőt: VotingWeb/PackageRoot/ServiceManifest.xml. A szolgáltatásjegyzék meghatározza a szolgáltatásvégpontokat. Keresse meg a szakaszt Endpoints , és szerkessze a végpont értékét ServiceEndpoint . Módosítsa a nevet a névre EndpointHttps, állítsa a protokollt a következőre https, a típust a következőre Input, a portot pedig a következőre 443: Mentse a módosításokat.

<?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>

A Kestrel konfigurálása HTTPS használatára

A Megoldáskezelőben nyissa meg a következő fájlt: VotingWeb/VotingWeb.cs. Konfigurálja a Kestrelt a HTTPS használatára, és keresse meg a tanúsítványt a Tanúsítvány:\LocalMachine\Saját tárolóban. Adja hozzá a következő using-utasításokat:

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

Frissítse az új EndpointHttps végpont használatára és a 443-as port figyelésére szolgáló ServiceInstanceListener értéket. Amikor beállítja a webes gazdagépet a Kestrel-kiszolgáló használatára, konfigurálnia kell a Kestrelt az IPv6-címek figyelésére az összes hálózati adapteren: 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(FindMatchingCertificateBySubject());
                        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();
        }))

Ezután adja hozzá a következő metódust, hogy a Kestrel megtalálja a tanúsítványt a Tanúsítvány:\LocalMachine\Saját tárolóban a tulajdonos használatával.

mytestcert Cserélje le <your_CN_value> azt, ha önaláírt tanúsítványt hozott létre az előző PowerShell-paranccsal, vagy használja a tanúsítvány CN-ét.

Ha helyi üzembe helyezést localhosthasznál, javasoljuk, hogy a hitelesítési kivételek elkerülése érdekében használja CN=localhost .

private X509Certificate2 FindMatchingCertificateBySubject(string subjectCommonName)
{
    using (var store = new X509Store(StoreName.My, StoreLocation.LocalMachine))
    {
        store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
        var certCollection = store.Certificates;
        var matchingCerts = new X509Certificate2Collection();
    
    foreach (var enumeratedCert in certCollection)
    {
      if (StringComparer.OrdinalIgnoreCase.Equals(subjectCommonName, enumeratedCert.GetNameInfo(X509NameType.SimpleName, forIssuer: false))
        && DateTime.Now < enumeratedCert.NotAfter
        && DateTime.Now >= enumeratedCert.NotBefore)
        {
          matchingCerts.Add(enumeratedCert);
        }
    }

        if (matchingCerts.Count == 0)
    {
        throw new Exception($"Could not find a match for a certificate with subject 'CN={subjectCommonName}'.");
    }
        
        return matchingCerts[0];
    }
}


Hálózati szolgáltatás hozzáférésének biztosítása a tanúsítvány titkos kulcsához

Egy korábbi lépésben importálta a tanúsítványt a Tanúsítvány:\LocalMachine\Saját tárolóba a fejlesztői számítógépen.

Most explicit módon adjon hozzáférést a szolgáltatást futtató fióknak (alapértelmezés szerint hálózati szolgáltatás) a tanúsítvány titkos kulcsához. Ezt a lépést manuálisan is elvégezheti (a certlm.msc eszközzel), de jobb, ha egy PowerShell-szkriptet futtat egy indítási szkript konfigurálásával a SetupEntryPoint szolgáltatásjegyzékben.

Feljegyzés

A Service Fabric támogatja a végponttanúsítványok ujjlenyomat vagy tulajdonos közös neve szerinti deklarálását. Ebben az esetben a futtatókörnyezet beállítja a tanúsítvány titkos kulcsának kötését és lefoglalását arra az identitásra, amelyként a szolgáltatás fut. A futtatókörnyezet a megfelelő titkos kulcs módosításait, megújításait és foglalási frissítéseit is figyeli.

Szolgáltatásbeállítás belépési pontjának konfigurálása

A Megoldáskezelőben nyissa meg a következőt: VotingWeb/PackageRoot/ServiceManifest.xml. CodePackage A szakaszban adja hozzá a SetupEntryPoint csomópontot, majd adjon hozzá egy csomópontotExeHost. In ExeHost, set Program to Setup.bat, and set WorkingFolder to CodePackage. A VotingWeb szolgáltatás indításakor a Setup.bat szkript a CodePackage mappában fut, mielőtt VotingWeb.exe elindul.

<?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>

A köteg és a PowerShell beállítási szkriptjeinek hozzáadása

A PowerShell értékből való futtatásához SetupEntryPointPowerShell.exe futtathat egy PowerShell-fájlra hivatkozó kötegfájlban.

Először adja hozzá a kötegfájlt a szolgáltatásprojekthez. A Megoldáskezelő kattintson a jobb gombbal a VotingWeb elemre, majd válassza az Új elem hozzáadása>lehetőséget. Adjon hozzá egy Setup.bat nevű új fájlt. Szerkessze a Setup.bat fájlt, és adja hozzá az alábbi parancsot:

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

Módosítsa a Setup.bat fájl tulajdonságait úgy, hogy a Másolás kimeneti könyvtárba legyen másolás, ha újabb.

A fájltulajdonságok beállítását bemutató képernyőkép.

A Megoldáskezelő kattintson a jobb gombbal a VotingWeb elemre. Ezután válassza az Új elem hozzáadása>lehetőséget, és adjon hozzá egy SetCertAccess.ps1 nevű új fájlt. Szerkessze a SetCertAccess.ps1 fájlt a következő szkript hozzáadásához:

$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\"

    if ($keyName -eq $null){
      $privateKey = [System.Security.Cryptography.X509Certificates.RSACertificateExtensions]::GetRSAPrivateKey($cert)      
      $keyName = $privateKey.Key.UniqueName
      $keyPath = "C:\ProgramData\Microsoft\Crypto\Keys"
    }

    $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;
    }
}

Módosítsa a SetCertAccess.ps1 fájl tulajdonságait, és állítsa a Másolás kimeneti könyvtárra másolásra, ha újabb.

A beállítási szkript futtatása rendszergazdaként

Alapértelmezés szerint a szolgáltatásbeállítási belépési pont végrehajtható ugyanazokkal a hitelesítő adatokkal fut, mint a Service Fabric (általában a hálózati szolgáltatásfiók). A SetCertAccess.ps1 rendszergazdai engedélyeket igényel. Az alkalmazásjegyzékben módosíthatja a biztonsági engedélyeket az indítási szkript futtatásához, egy helyi rendszergazdai fiókkal.

A Solution Explorerben (Megoldáskezelő) nyissa meg a Voting/ApplicationPackageRoot/ApplicationManifest.xml fájlt. Először hozzon létre egy szakaszt Principals , és adjon hozzá egy új felhasználót (például SetupAdminUser). Adja hozzá a SetupAdminUser felhasználói fiókot a rendszergazdák rendszercsoportjához.

Ezután a VotingWebPkg ServiceManifestImport szakaszban konfiguráljon egy RunAsPolicy-t, hogy alkalmazza a telepítő Rendszergazda Felhasználó egyszerűjét a telepítési belépési pontra. Ez a szabályzat tájékoztatja a Service Fabricet, hogy a Setup.bat fájl telepítőként fut Rendszergazda Felhasználóként (rendszergazdai engedélyekkel).

<?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>

Az alkalmazás helyi futtatása

A Megoldáskezelő válassza ki a szavazóalkalmazást, és állítsa be az alkalmazás URL-tulajdonságát a következőrehttps://localhost:443: .

Mentse az összes fájlt, majd válassza az F5 lehetőséget az alkalmazás helyi futtatásához. Az alkalmazás üzembe helyezése után megnyílik egy böngésző.https://localhost:443 Ha önaláírt tanúsítványt használ, figyelmeztetés jelenik meg arról, hogy a számítógép nem bízik a webhely biztonságában. Lépjen tovább a weblapra.

Képernyőkép a Service Fabric szavazási mintaalkalmazásról, amely egy böngészőben fut, és a localhost URL-címe.

A tanúsítvány telepítése fürtcsomópontokra

Mielőtt üzembe helyezné az alkalmazást az Azure-ban, telepítse a tanúsítványt az összes távoli fürtcsomópont Tanúsítvány:\LocalMachine\Saját tárolójában. A szolgáltatások áttérhetnek a fürt különböző csomópontjaira. Amikor az előtérbeli webszolgáltatás egy fürtcsomóponton indul el, az indítási szkript megkeresi a tanúsítványt, és beállítja a hozzáférési engedélyeket.

A tanúsítvány fürtcsomópontokra való telepítéséhez először exportálja a tanúsítványt PFX-fájlként. Nyissa meg a certlm.msc alkalmazásfájlt, és nyissa meg a Személyes>tanúsítványok elemet. Kattintson a jobb gombbal a mytestcert tanúsítványra, majd válassza a Minden tevékenység>exportálása lehetőséget.

A tanúsítvány exportálását bemutató képernyőkép.

Az exportálási varázslóban válassza az Igen lehetőséget, exportálja a titkos kulcsot, majd válassza ki a PFX formátumot. Exportálja a fájlt a C:\Users\sfuser\votingappcert.pfx helyre.

Ezután telepítse a tanúsítványt a távoli fürtre PowerShell-szkriptek használatával.

Figyelmeztetés

Az önaláírt tanúsítvány elegendő alkalmazások fejlesztéséhez és teszteléséhez. Éles alkalmazások esetén az önaláírt tanúsítvány helyett használjon hitelesítésszolgáltatótól származó tanúsítványt.

Nyissa meg a 443-at az Azure Load Balancerben és a virtuális hálózaton

Nyissa meg a 443-at a terheléselosztóban, ha nincs megnyitva:

$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

Tegye ugyanezt a társított virtuális hálózat esetében is:

$rulename="allowAppPort$port"
$nsgname="voting-vnet-security"
$RGname="voting_RG"
$port=443

# Get the network security group resource
$nsg = Get-AzNetworkSecurityGroup -Name $nsgname -ResourceGroupName $RGname

# Add the inbound security rule.
$nsg | Add-AzNetworkSecurityRuleConfig -Name $rulename -Description "Allow app port" -Access Allow `
    -Protocol * -Direction Inbound -Priority 3891 -SourceAddressPrefix "*" -SourcePortRange * `
    -DestinationAddressPrefix * -DestinationPortRange $port

# Update the network security group
$nsg | Set-AzNetworkSecurityGroup

Az alkalmazás üzembe helyezése az Azure-ban

Mentse az összes fájlt, váltson hibakeresésről kiadásra, és válassza az F6 lehetőséget az újraépítéshez. A Megoldáskezelő kattintson a jobb gombbal a Szavazás elemre, és válassza a Közzététel lehetőséget. Válassza ki az Alkalmazás üzembe helyezése egy fürtön területen létrehozott fürt kapcsolati végpontját, vagy válasszon ki egy másik fürtöt. Válassza a Közzététel lehetőséget az alkalmazás távoli fürtben való közzétételéhez.

Az alkalmazás üzembe helyezésekor nyisson meg egy webböngészőt, és nyissa https://mycluster.region.cloudapp.azure.com:443 meg (frissítse az URL-címet a fürt kapcsolati végpontjával). Ha önaláírt tanúsítványt használ, figyelmeztetés jelenik meg arról, hogy a számítógép nem bízik a webhely biztonságában. Lépjen tovább a weblapra.

Képernyőkép egy böngészőablakban futó Service Fabric-szavazási mintaalkalmazásról.

Következő lépés

Folytassa a következő oktatóanyaggal: