Używanie certyfikatu TLS/SSL w kodzie w usłudze Azure App Service

W kodzie aplikacji możesz uzyskać dostęp do certyfikatów publicznych lub prywatnych dodanych do usługi App Service. Kod aplikacji może działać jako klient i uzyskać dostęp do usługi zewnętrznej wymagającej uwierzytelniania certyfikatu lub może być konieczne wykonanie zadań kryptograficznych. W tym przewodniku z instrukcjami pokazano, jak używać certyfikatów publicznych lub prywatnych w kodzie aplikacji.

Takie podejście do używania certyfikatów w kodzie korzysta z funkcji PROTOKOŁU TLS w usłudze App Service, która wymaga, aby aplikacja znajdowała się w warstwie Podstawowa lub wyższej. Jeśli aplikacja znajduje się w warstwie Bezpłatna lub Współdzielona , możesz dołączyć plik certyfikatu do repozytorium aplikacji.

Gdy zezwolisz usłudze App Service na zarządzanie certyfikatami TLS/SSL, możesz obsługiwać certyfikaty i kod aplikacji oddzielnie oraz chronić poufne dane.

Wymagania wstępne

Aby postępować zgodnie z tym przewodnikiem z instrukcjami:

Znajdowanie odcisku palca

W witrynie Azure Portal z menu po lewej stronie wybierz pozycję Nazwa> aplikacji usługi App Services<>.

W obszarze nawigacji po lewej stronie aplikacji wybierz pozycję Certyfikaty, a następnie wybierz pozycję Bring your own certificates (pfx) lub Public key certificates (.cer).

Znajdź certyfikat, którego chcesz użyć, i skopiuj odcisk palca.

Kopiowanie odcisku palca certyfikatu

Udostępnianie certyfikatu

Aby uzyskać dostęp do certyfikatu w kodzie aplikacji, dodaj jego odcisk palca do WEBSITE_LOAD_CERTIFICATES ustawienia aplikacji, uruchamiając następujące polecenie w usłudze Cloud Shell:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_CERTIFICATES=<comma-separated-certificate-thumbprints>

Aby udostępnić wszystkie certyfikaty, ustaw wartość na *.

Uwaga

Po WEBSITE_LOAD_CERTIFICATES ustawieniu *parametru wszystkie wcześniej dodane certyfikaty są dostępne dla kodu aplikacji. Jeśli później dodasz certyfikat do aplikacji, uruchom ponownie aplikację, aby nowy certyfikat był dostępny dla aplikacji. Aby uzyskać więcej informacji, zobacz Aktualizowanie (odnawianie) certyfikatu.

Ładowanie certyfikatu w aplikacjach systemu Windows

Ustawienie WEBSITE_LOAD_CERTIFICATES aplikacji sprawia, że określone certyfikaty są dostępne dla aplikacji hostowanej w systemie Windows w magazynie certyfikatów systemu Windows w obszarze Bieżący użytkownik\My.

W kodzie języka C# uzyskujesz dostęp do certyfikatu za pomocą odcisku palca certyfikatu. Poniższy kod ładuje certyfikat z odciskiem E661583E8FABEF4C0BEF694CBC41C28FB81CD870palca .

using System;
using System.Linq;
using System.Security.Cryptography.X509Certificates;

string certThumbprint = "E661583E8FABEF4C0BEF694CBC41C28FB81CD870";
bool validOnly = false;

using (X509Store certStore = new X509Store(StoreName.My, StoreLocation.CurrentUser))
{
  certStore.Open(OpenFlags.ReadOnly);

  X509Certificate2Collection certCollection = certStore.Certificates.Find(
                              X509FindType.FindByThumbprint,
                              // Replace below with your certificate's thumbprint
                              certThumbprint,
                              validOnly);
  // Get the first cert with the thumbprint
  X509Certificate2 cert = certCollection.OfType<X509Certificate2>().FirstOrDefault();

  if (cert is null)
      throw new Exception($"Certificate with thumbprint {certThumbprint} was not found");

  // Use certificate
  Console.WriteLine(cert.FriendlyName);
  
  // Consider to call Dispose() on the certificate after it's being used, available in .NET 4.6 and later
}

W kodzie Java uzyskujesz dostęp do certyfikatu z magazynu "Windows-MY" przy użyciu pola Nazwa pospolita podmiotu (zobacz Certyfikat klucza publicznego). Poniższy kod pokazuje, jak załadować certyfikat klucza prywatnego:

import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.PrivateKey;

...
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null); 
Certificate cert = ks.getCertificate("<subject-cn>");
PrivateKey privKey = (PrivateKey) ks.getKey("<subject-cn>", ("<password>").toCharArray());

// Use the certificate and key
...

W przypadku języków, które nie obsługują magazynu certyfikatów systemu Windows lub oferują niewystarczającą obsługę, zobacz Ładowanie certyfikatu z pliku.

Ładowanie certyfikatu z pliku

Jeśli musisz załadować ręcznie przekazany plik certyfikatu, lepiej jest przekazać certyfikat przy użyciu usługi FTPS zamiast usługi Git, na przykład. Należy zachować poufne dane, takie jak certyfikat prywatny, poza kontrolą źródła.

Uwaga

ASP.NET i ASP.NET Core w systemie Windows muszą uzyskiwać dostęp do magazynu certyfikatów, nawet jeśli załadujesz certyfikat z pliku. Aby załadować plik certyfikatu w aplikacji .NET systemu Windows, załaduj bieżący profil użytkownika za pomocą następującego polecenia w usłudze Cloud Shell:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_USER_PROFILE=1

Takie podejście do używania certyfikatów w kodzie korzysta z funkcji PROTOKOŁU TLS w usłudze App Service, która wymaga, aby aplikacja znajdowała się w warstwie Podstawowa lub wyższej.

Poniższy przykład w języku C# ładuje certyfikat publiczny ze ścieżki względnej w aplikacji:

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

...
var bytes = File.ReadAllBytes("~/<relative-path-to-cert-file>");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Aby dowiedzieć się, jak załadować certyfikat TLS/SSL z pliku w Node.js, PHP, Python lub Java, zobacz dokumentację odpowiedniego języka lub platformy internetowej.

Ładowanie certyfikatu w kontenerach systemu Linux/Windows

Ustawienie WEBSITE_LOAD_CERTIFICATES aplikacji sprawia, że określone certyfikaty są dostępne dla kontenerów niestandardowych systemu Windows lub Linux (w tym wbudowanych kontenerów systemu Linux) jako plików. Pliki znajdują się w następujących katalogach:

Platforma kontenerów Certyfikaty publiczne Certyfikaty prywatne
Kontener systemu Windows C:\appservice\certificates\public C:\appservice\certificates\private
Kontener systemu Linux /var/ssl/certs /var/ssl/private

Nazwy plików certyfikatów to odciski palca certyfikatu.

Uwaga

Usługa App Service wprowadza ścieżki certyfikatów do kontenerów systemu Windows jako następujące zmienne WEBSITE_PRIVATE_CERTS_PATHśrodowiskowe , WEBSITE_INTERMEDIATE_CERTS_PATH, WEBSITE_PUBLIC_CERTS_PATHi WEBSITE_ROOT_CERTS_PATH. Lepiej jest odwołać się do ścieżki certyfikatu ze zmiennymi środowiskowymi zamiast trwale połączyć ścieżkę certyfikatu, jeśli ścieżki certyfikatów zmienią się w przyszłości.

Ponadto kontenery systemów Windows Server Core i Windows Nano Server automatycznie ładują certyfikaty do magazynu certyfikatów w folderze LocalMachine\My. Aby załadować certyfikaty, postępuj zgodnie z tym samym wzorcem co Ładowanie certyfikatu w aplikacjach systemu Windows. W przypadku kontenerów opartych na systemie Windows Nano użyj tych ścieżek plików Załaduj certyfikat bezpośrednio z pliku.

Poniższy kod w języku C# pokazuje, jak załadować certyfikat publiczny w aplikacji systemu Linux.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;

...
var bytes = File.ReadAllBytes("/var/ssl/certs/<thumbprint>.der");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Poniższy kod w języku C# pokazuje, jak załadować certyfikat prywatny w aplikacji systemu Linux.

using System;
using System.IO;
using System.Security.Cryptography.X509Certificates;
...
var bytes = File.ReadAllBytes("/var/ssl/private/<thumbprint>.p12");
var cert = new X509Certificate2(bytes);

// Use the loaded certificate

Aby dowiedzieć się, jak załadować certyfikat TLS/SSL z pliku w Node.js, PHP, Python lub Java, zobacz dokumentację odpowiedniego języka lub platformy internetowej.

Podczas aktualizowania (odnawiania) certyfikatu

Po odnowieniu certyfikatu i dodaniu go do aplikacji zostanie wyświetlony nowy odcisk palca, który również musi być dostępny. Sposób jego działania zależy od typu certyfikatu.

Jeśli ręcznie przekażesz certyfikat publiczny lub prywatny :

  • Jeśli jawnie wyświetlisz odciski palca w programie WEBSITE_LOAD_CERTIFICATES, dodaj nowy odcisk palca do ustawienia aplikacji.
  • Jeśli WEBSITE_LOAD_CERTIFICATES ustawiono wartość *, uruchom ponownie aplikację, aby udostępnić nowy certyfikat.

W przypadku odnowienia certyfikatu w usłudze Key Vault, takiego jak przy użyciu certyfikatu usługi App Service, codzienna synchronizacja z usługi Key Vault powoduje automatyczne zaktualizowanie niezbędnej aktualizacji podczas synchronizowania aplikacji z odnowionym certyfikatem.

  • Jeśli WEBSITE_LOAD_CERTIFICATES zawiera stary odcisk palca odnowionego certyfikatu, codzienna synchronizacja automatycznie aktualizuje stary odcisk palca do nowego odcisku palca.
  • Jeśli WEBSITE_LOAD_CERTIFICATES ustawiono wartość *, synchronizacja dzienna powoduje, że nowy certyfikat jest dostępny automatycznie.

Więcej zasobów