Использование TLS/SSL-сертификата в коде в Службе приложений Azure

В коде приложения можно получить доступ к общедоступным или частным сертификатам, добавляемым в службу приложений. Код приложения может действовать как клиент и обращаться к внешней службе, для которой требуется проверка подлинности сертификата, или же может по необходимости выполнять криптографические задачи. В этом пошаговом руководстве показано, как использовать общедоступные или частные сертификаты в коде приложения.

Этот подход к использованию сертификатов в коде использует функции TLS в Служба приложений, что требует, чтобы ваше приложение было на уровне "Базовый" или выше. Если приложение находится на уровне Бесплатный или Общий, можно включить файл сертификата в репозиторий приложения.

Доверив управление TLS- или SSL-сертификатами службе приложений, вы сможете отдельно управлять сертификатами и кодом приложения, защитив таким образом конфиденциальные данные.

Необходимые компоненты

Ознакомьтесь со следующими статьями:

Найдите отпечаток

На портале Azure в меню слева выберите Службы приложений><имя_приложения>.

В левой области навигации приложения выберите сертификаты, а затем выберите "Принести собственные сертификаты" (PFX) или сертификаты открытого ключа (CER).

Найдите сертификат, который вы хотите использовать. Затем скопируйте его отпечаток.

Copy the certificate thumbprint

Открытие доступа к сертификату

Чтобы получить доступ к сертификату в коде приложения, добавьте его отпечаток в WEBSITE_LOAD_CERTIFICATES параметр приложения, выполнив следующую команду в Cloud Shell:

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

Чтобы сделать доступными все сертификаты, установите значение *.

Примечание.

Если WEBSITE_LOAD_CERTIFICATES задано *, все ранее добавленные сертификаты доступны для кода приложения. Если вы добавите сертификат в приложение позже, перезапустите приложение, чтобы сделать новый сертификат доступным для приложения. Дополнительные сведения см. в статье Об обновлении (продлении) сертификата.

Загрузка сертификата в приложениях Windows

Параметр приложения WEBSITE_LOAD_CERTIFICATES делает указанные сертификаты доступными для размещенного в Windows приложения в хранилище сертификатов Windows в Current User\My.

В коде C# обращение к сертификату происходит по отпечатку сертификата. Следующий код загружает сертификат с отпечатком E661583E8FABEF4C0BEF694CBC41C28FB81CD870.

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
}

В коде Java доступ к сертификату происходит из хранилища Windows-MY с использованием поля общего имени субъекта (см. раздел Сертификат открытого ключа). В следующем коде показано, как загрузить сертификат закрытого ключа.

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

Дополнительные сведения о языках, которые не поддерживают или предлагают недостаточную поддержку хранилища сертификатов Windows, см. в разделе Загрузка сертификата из файла.

Загрузка сертификата из файла

Если вам нужно загрузить файл сертификата, который вы перегрузили вручную, лучше, к примеру, передать сертификат с помощью FTPS вместо Git. Конфиденциальные данные, такие как закрытый сертификат, следует держать вне из системы управления исходным кодом.

Примечание.

ASP.NET и ASP.NET Core в Windows должны получить доступ к хранилищу сертификатов, даже если вы загрузили сертификат из файла. Чтобы загрузить файл сертификата в приложение Windows .NET, загрузите профиль текущего пользователя с помощью следующей команды в Cloud Shell:

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

Этот подход к использованию сертификатов в коде использует функции TLS в Служба приложений, что требует, чтобы ваше приложение было на уровне "Базовый" или выше.

Следующий пример на C# загружает открытый сертификат из относительного пути в приложении:

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

Сведения о загрузке TLS/SSL-сертификата из файла в Node.js, PHP, Python или Java см. в документации по соответствующему языку или веб-платформе.

Загрузка сертификата в контейнерах Linux или Windows

Параметр WEBSITE_LOAD_CERTIFICATES приложения делает указанные сертификаты доступными для пользовательских контейнеров Windows или Linux (включая встроенные контейнеры Linux) в виде файлов. Файлы находятся в следующих каталогах:

Платформа контейнера Открытые сертификаты Закрытые сертификаты
Контейнер Windows C:\appservice\certificates\public C:\appservice\certificates\private
Контейнер Linux /var/ssl/certs /var/ssl/private

Именами файлов сертификатов будут соответствующие отпечатки сертификатов.

Примечание.

Служба приложений внедряет пути к сертификатам в контейнеры Windows в виде следующих переменных среды: WEBSITE_PRIVATE_CERTS_PATH, WEBSITE_INTERMEDIATE_CERTS_PATH, WEBSITE_PUBLIC_CERTS_PATH и WEBSITE_ROOT_CERTS_PATH. Лучше сослаться на путь к сертификату с помощью переменных среды, а не прописывать прямо в коде путь к сертификату в случае, если пути сертификатов изменятся в будущем.

Кроме того, контейнеры Windows Server Core автоматически загружают сертификаты в хранилище сертификатов в LocalMachine\My. Чтобы загрузить сертификаты, используйте тот же шаблон, что и для загрузки сертификата в приложениях Windows. Для контейнеров на основе Windows Nano используйте эти пути к файлам, чтобы загрузить сертификат непосредственно из файла.

В следующем коде C# показано, как загрузить открытый сертификат в приложение 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

В следующем коде C# показано, как загрузить закрытый сертификат в приложение 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

Сведения о загрузке TLS/SSL-сертификата из файла в Node.js, PHP, Python или Java см. в документации по соответствующему языку или веб-платформе.

При обновлении (продлении) сертификата

При продлении сертификата и его добавлении в приложение он получает новый отпечаток, который также должен быть доступен. Принцип работы зависит от типа сертификата.

Если вы вручную отправите общедоступный или частный сертификат:

  • Если вы явно перечисляете отпечатки WEBSITE_LOAD_CERTIFICATES, добавьте новый отпечаток в параметр приложения.
  • Если WEBSITE_LOAD_CERTIFICATES задано значение *, перезапустите приложение, чтобы сделать новый сертификат доступным.

При продлении сертификата в Key Vault, например с сертификатом Служба приложений, ежедневная синхронизация из Key Vault автоматически обновляется при синхронизации приложения с обновленным сертификатом.

  • Если WEBSITE_LOAD_CERTIFICATES содержит старый отпечаток обновленного сертификата, ежедневная синхронизация обновляет старый отпечаток на новый отпечаток автоматически.
  • Если WEBSITE_LOAD_CERTIFICATES задано значение *, ежедневная синхронизация автоматически делает новый сертификат доступным автоматически.

Дополнительные ресурсы