Поделиться через


Использование TLS/SSL-сертификатов в коде приложения

Это важно

Начиная с 28 июля 2025 г. изменения в управляемых сертификатах службы приложений (ASMC) повлияют на выдачу и продление сертификатов в определенных сценариях. Хотя большинству клиентов не нужно принимать меры, рекомендуется ознакомиться с подробным блогом ASMC для получения дополнительных сведений.

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

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

Если служба приложений позволяет управлять сертификатами TLS/Secure Sockets Layer (SSL), вы можете поддерживать сертификаты и код приложения отдельно и защищать конфиденциальные данные.

Предпосылки

Чтобы следовать этой статье, см. следующее:

Найти отпечаток пальца

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

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

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

Снимок экрана: копирование отпечатка сертификата.

Сделать сертификат доступным

Чтобы получить доступ к сертификату в коде приложения, добавьте его отпечаток пальца в WEBSITE_LOAD_CERTIFICATES настройку приложения. Выполните следующую команду в Azure 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_PATHWEBSITE_PUBLIC_CERTS_PATHи WEBSITE_ROOT_CERTS_PATH. Лучше ссылаться на путь сертификата с помощью переменных среды, а не жестко прописывать путь к сертификату, на случай, если пути к сертификату изменятся в будущем.

Кроме того, контейнеры Windows Server Core и Windows Nano Server автоматически загружают сертификаты в хранилище 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 задано значение *, перезапустите приложение, чтобы сделать новый сертификат доступным.

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

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