Использование TLS/SSL-сертификата в коде в Службе приложений Azure
В коде приложения можно получить доступ к общедоступным или частным сертификатам, добавляемым в службу приложений. Код приложения может действовать как клиент и обращаться к внешней службе, для которой требуется проверка подлинности сертификата, или же может по необходимости выполнять криптографические задачи. В этом пошаговом руководстве показано, как использовать общедоступные или частные сертификаты в коде приложения.
Этот подход к использованию сертификатов в коде использует функции TLS в Служба приложений, что требует, чтобы ваше приложение было на уровне "Базовый" или выше. Если приложение находится на уровне Бесплатный или Общий, можно включить файл сертификата в репозиторий приложения.
Доверив управление TLS- или SSL-сертификатами службе приложений, вы сможете отдельно управлять сертификатами и кодом приложения, защитив таким образом конфиденциальные данные.
Необходимые компоненты
Ознакомьтесь со следующими статьями:
Найдите отпечаток
На портале Azure в меню слева выберите Службы приложений><имя_приложения>.
В левой области навигации приложения выберите сертификаты, а затем выберите "Принести собственные сертификаты" (PFX) или сертификаты открытого ключа (.cer).
Найдите сертификат, который вы хотите использовать. Затем скопируйте его отпечаток.
Открытие доступа к сертификату
Чтобы получить доступ к сертификату в коде приложения, добавьте его отпечаток в 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 и 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
задано значение*
, перезапустите приложение, чтобы сделать новый сертификат доступным.
При продлении сертификата в Key Vault, например с сертификатом Служба приложений, ежедневная синхронизация из Key Vault автоматически обновляется при синхронизации приложения с обновленным сертификатом.
- Если
WEBSITE_LOAD_CERTIFICATES
содержит старый отпечаток обновленного сертификата, ежедневная синхронизация обновляет старый отпечаток на новый отпечаток автоматически. - Если
WEBSITE_LOAD_CERTIFICATES
задано значение*
, ежедневная синхронизация автоматически делает новый сертификат доступным автоматически.
Дополнительные ресурсы
- Защита пользовательского доменного имени с помощью привязки TLS/SSL в Службе приложений Azure
- Принудительное использование HTTPS
- Принудительное применение TLS 1.1/1.2
- FAQ : App Service Certificates (Вопросы по сертификатам службы приложений и ответы на них)
- Справка по переменным среды и параметрам приложений