Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten samouczek jest trzecią częścią serii. Dowiedz się, jak dodać punkt końcowy HTTPS w usłudze ASP.NET Core uruchomionej w usłudze Azure Service Fabric. Po zakończeniu masz aplikację do głosowania z włączoną obsługą HTTPS, która korzysta z webowej aplikacji front-end w technologii ASP.NET Core i nasłuchuje na porcie 443. Jeśli nie chcesz ręcznie tworzyć aplikacji do głosowania w części jednej z serii samouczków, możesz pobrać kod źródłowy , aby uzyskać ukończoną aplikację.
Z tego samouczka dowiesz się, jak wykonywać następujące działania:
- Definiowanie punktu końcowego HTTPS w usłudze
- Konfigurowanie usługi Kestrel do korzystania z protokołu HTTPS
- Instalowanie certyfikatu TLS/SSL w węzłach klastra zdalnego
- Nadawanie usłudze sieciowej dostępu do klucza prywatnego certyfikatu
- Otwieranie portu 443 w module równoważenia obciążenia platformy Azure
- Wdrażanie aplikacji w klastrze zdalnym
W serii samouczków pokazano, jak wykonać następujące działania:
- Kompilowanie aplikacji .NET Service Fabric
- Wdrażanie aplikacji w klastrze zdalnym
- Dodawanie punktu końcowego HTTPS do usługi frontonu platformy ASP.NET Core (ten samouczek)
- Konfigurowanie ciągłej integracji/ciągłego wdrażania przy użyciu usługi Azure Pipelines
- Konfigurowanie monitorowania i diagnostyki dla aplikacji
Uwaga
Zalecamy korzystanie z modułu Azure Az programu PowerShell do interakcji z platformą Azure. 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.
Wymagania wstępne
Przed rozpoczęciem tego samouczka:
- Jeśli nie masz subskrypcji platformy Azure, utwórz bezpłatne konto.
- Zainstaluj program Visual Studio 2019 w wersji 16.5 lub nowszej, w tym pakiet roboczy Programowanie na platformie Azure oraz pakiet roboczy tworzenia aplikacji internetowych i ASP.NET.
- Zainstaluj zestaw SDK usługi Service Fabric.
Uzyskiwanie certyfikatu lub tworzenie certyfikatu programowania z podpisem własnym
W przypadku aplikacji produkcyjnych należy użyć certyfikatu z urzędu certyfikacji. Do celów programistycznych i testowych można utworzyć i użyć certyfikatu z podpisem własnym. Zestaw SDK usługi Service Fabric zawiera skrypt CertSetup.ps1 . Skrypt tworzy certyfikat z podpisem własnym i importuje go do magazynu certyfikatów Cert:\LocalMachine\My . Otwórz okno wiersza polecenia jako administrator i uruchom następujące polecenie, aby utworzyć certyfikat zawierający podmiot "CN=mytestcert":
PS C:\program files\microsoft sdks\service fabric\clustersetup\secure> .\CertSetup.ps1 -Install -CertSubjectName CN=mytestcert
Jeśli masz już osobisty plik wymiany informacji (PFX), uruchom następujące polecenie, aby zaimportować certyfikat do magazynu certyfikatów Cert:\LocalMachine\My:
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
Definiowanie punktu końcowego HTTPS w manifeście usługi
Otwórz program Visual Studio przy użyciu opcji Uruchom jako administrator , a następnie otwórz rozwiązanie do głosowania. W Eksploratorze rozwiązań otwórz plik VotingWeb/PackageRoot/ServiceManifest.xml. Manifest usługi definiuje punkty końcowe usługi. Znajdź sekcję Endpoints i zmodyfikuj wartość dla punktu końcowego ServiceEndpoint. Zmień nazwę na EndpointHttps, ustaw protokół na https, typ na Input, a port na 443. Zapisz zmiany.
<?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>
Konfigurowanie usługi Kestrel do korzystania z protokołu HTTPS
W Eksploratorze rozwiązań otwórz plik VotingWeb/VotingWeb.cs . Skonfiguruj usługę Kestrel, aby używać protokołu HTTPS i wyszukać certyfikat w magazynie Cert:\LocalMachine\My Store. Dodaj następujące oświadczenia using:
using System.Net;
using Microsoft.Extensions.Configuration;
using System.Security.Cryptography.X509Certificates;
Zaktualizuj wartość ServiceInstanceListener, aby użyć EndpointHttps nowego punktu końcowego i nasłuchiwać na porcie 443. Podczas konfigurowania hosta internetowego do używania serwera Kestrel należy skonfigurować usługę Kestrel tak, aby nasłuchiwać adresów IPv6 we wszystkich interfejsach sieciowych: 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();
}))
Następnie dodaj następującą metodę, aby usługa Kestrel mogła znaleźć certyfikat w magazynie Cert:\LocalMachine\My przy użyciu nazwy podmiotu.
Zastąp <your_CN_value> ciągiem mytestcert , jeśli został utworzony certyfikat z podpisem własnym przy użyciu poprzedniego polecenia programu PowerShell lub użyj Nazwy Wspólnej (CN) swojego certyfikatu.
Jeśli używasz wdrożenia lokalnego do localhost, zalecamy użycie CN=localhost, aby uniknąć wyjątków uwierzytelniania.
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];
}
}
Udzielanie usłudze sieciowej dostępu do klucza prywatnego certyfikatu
W poprzednim kroku zaimportowaliśmy certyfikat do magazynu Cert:\LocalMachine\My na komputerze dewelopera.
Teraz jawnie przypisz kontu, które uruchamia usługę (Network Service, domyślnie), dostęp do klucza prywatnego certyfikatu. Ten krok można wykonać ręcznie (przy użyciu narzędzia certlm.msc ), ale lepiej uruchomić skrypt programu PowerShell, konfigurując skrypt uruchamiania w SetupEntryPoint manifeście usługi.
Uwaga
Usługa Service Fabric obsługuje deklarowanie certyfikatów punktów końcowych za pomocą odcisku palca lub nazwy pospolitej podmiotu. W takim przypadku środowisko uruchomieniowe konfiguruje powiązanie i alokację klucza prywatnego certyfikatu dla tożsamości, jako której usługa jest uruchamiana. Środowisko uruchomieniowe monitoruje również certyfikat pod kątem zmian, odnawiania i aktualizacji alokacji odpowiedniego klucza prywatnego.
Konfiguracja punktu wejścia dla ustawień usługi
W Eksploratorze rozwiązań otwórz plik VotingWeb/PackageRoot/ServiceManifest.xml.
CodePackage W sekcji dodaj SetupEntryPoint węzeł, a następnie dodaj ExeHost węzeł. W ExeHost, ustaw Program na Setup.bat, a WorkingFolder na CodePackage. Po uruchomieniu usługi VotingWeb skrypt Setup.bat jest wykonywany w folderze CodePackage przed rozpoczęciem VotingWeb.exe .
<?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>
Dodawanie skryptów konfiguracji usługi Batch i programu PowerShell
Aby uruchomić PowerShell z wartości dla SetupEntryPoint, można uruchomić PowerShell.exe w pliku wsadowym, który wskazuje na plik programu PowerShell.
Najpierw dodaj plik wsadowy do projektu usługi. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy pozycję VotingWeb, a następnie wybierz polecenie Dodaj>nowy element. Dodaj nowy plik o nazwie Setup.bat. Edytuj plik Setup.bat i dodaj następujące polecenie:
powershell.exe -ExecutionPolicy Bypass -Command ".\SetCertAccess.ps1"
Zmodyfikuj właściwości pliku Setup.bat, aby ustawić opcję Kopiuj do katalogu wyjściowego na Kopiuj, jeśli nowszy.
W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy pozycję VotingWeb. Następnie wybierz pozycję Dodaj>nowy element i dodaj nowy plik o nazwie SetCertAccess.ps1. Edytuj plik SetCertAccess.ps1 , aby dodać następujący skrypt:
$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;
}
}
Zmodyfikuj właściwości pliku SetCertAccess.ps1, ustawiając Kopiuj do katalogu wyjściowego na Kopiuj, jeśli nowszy.
Uruchom skrypt instalacyjny jako administrator
Domyślnie plik wykonywalny punktu wejścia konfiguracji usługi jest uruchamiany przy użyciu tych samych poświadczeń co usługa Service Fabric (zazwyczaj konto usługi sieciowej). SetCertAccess.ps1wymaga uprawnień administratora. W manifeście aplikacji można zmienić uprawnienia zabezpieczeń, aby uruchomić skrypt uruchamiania na koncie administratora lokalnego.
W Eksploratorze rozwiązań otwórz plik Voting/ApplicationPackageRoot/ApplicationManifest.xml. Najpierw utwórz sekcję Principals i dodaj nowego użytkownika (na przykład SetupAdminUser). Dodaj konto użytkownika SetupAdminUser do grupy systemowej Administratorzy.
Następnie w pliku VotingWebPkg w ServiceManifestImport sekcji skonfiguruj element RunAsPolicy, aby zastosować podmiot zabezpieczeń SetupAdminUser do punktu wejścia konfiguracji. Te zasady informują usługę Service Fabric, że plik Setup.bat jest uruchamiany jako SetupAdminUser (z uprawnieniami administratora).
<?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>
Uruchamianie aplikacji lokalnie
W Eksploratorze rozwiązań wybierz aplikację Voting i ustaw właściwość Adres URL aplikacji na https://localhost:443.
Zapisz wszystkie pliki, a następnie wybierz F5, aby uruchomić aplikację lokalnie. Po wdrożeniu aplikacji zostanie otwarta przeglądarka na https://localhost:443. Jeśli używasz certyfikatu z podpisem własnym, zostanie wyświetlone ostrzeżenie, że komputer nie ufa bezpieczeństwu tej witryny internetowej. Przejdź do strony internetowej.
Instalowanie certyfikatu w węzłach klastra
Przed wdrożeniem aplikacji na platformie Azure zainstaluj certyfikat w magazynie Cert:\LocalMachine\My wszystkich zdalnych węzłów klastra. Usługi mogą przejść do różnych węzłów klastra. Po uruchomieniu usługi front-end na węźle klastra skrypt uruchamiania wyszukuje certyfikat i konfiguruje uprawnienia dostępu.
Aby zainstalować certyfikat w węzłach klastra, najpierw wyeksportuj certyfikat jako plik PFX. Otwórz plik aplikacji certlm.msc i przejdź do pozycji Certyfikaty osobiste>. Kliknij prawym przyciskiem myszy certyfikat mytestcert , a następnie wybierz pozycję Wszystkie zadania>Eksportuj.
W kreatorze eksportu wybierz pozycję Tak, wyeksportuj klucz prywatny, a następnie wybierz format PFX. Wyeksportuj plik do folderu C:\Users\sfuser\votingappcert.pfx.
Następnie zainstaluj certyfikat w klastrze zdalnym przy użyciu skryptów programu PowerShell.
Ostrzeżenie
Certyfikat z podpisem własnym jest wystarczający do tworzenia i testowania aplikacji. W przypadku aplikacji produkcyjnych należy użyć certyfikatu z urzędu certyfikacji zamiast certyfikatu z podpisem własnym.
Otwieranie portu 443 w usłudze Azure Load Balancer i sieci wirtualnej
Otwórz port 443 w module równoważenia obciążenia, jeśli nie jest otwarty:
$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
Wykonaj to samo w przypadku skojarzonej sieci wirtualnej:
$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
Wdrożenie aplikacji na platformie Azure
Zapisz wszystkie pliki, przełącz się z debugowania do wydania i wybierz F6, aby ponownie skompilować. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy pozycję Głosowanie i wybierz polecenie Publikuj. Wybierz punkt końcowy połączenia klastra utworzonego w obszarze Wdrażanie aplikacji w klastrze lub wybierz inny klaster. Wybierz pozycję Publikuj, aby opublikować aplikację w klastrze zdalnym.
Po wdrożeniu aplikacji otwórz przeglądarkę internetową i przejdź do https://mycluster.region.cloudapp.azure.com:443 (zaktualizuj adres URL zgodnie z punktem końcowym połączenia dla klastra). Jeśli używasz certyfikatu z podpisem własnym, zostanie wyświetlone ostrzeżenie, że komputer nie ufa bezpieczeństwu tej witryny internetowej. Przejdź do strony internetowej.
Następny krok
Przejdź do następnego samouczka: