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


Импорт файла сертификата в контейнер, работающий в Service Fabric

Примечание.

Для кластеров Service Fabric, работающих в Azure, рекомендуется использовать управляемое удостоверение Service Fabric для подготовки сертификатов приложений из контейнера. Управляемое удостоверение обеспечивает изоляцию секретов и сертификатов на уровне обслуживания и позволяет подготовке сертификатов приложений быть частью рабочего процесса приложения, а не рабочего процесса инфраструктуры. Механизм CertificateRef будет признан устаревшим в будущем релизе.

Защитите свои службы контейнеров, указав сертификат. Service Fabric предоставляет для служб в контейнере механизм, который обеспечивает доступ к сертификату, установленному на узлах кластера Windows или Linux (версии 5.7 или выше). Сертификат должен быть установлен в хранилище сертификатов в разделе LocalMachine на всех узлах кластера. Закрытый ключ, соответствующий сертификату, должен быть доступен, доступен и экспортируемый в Windows. Сведения о сертификате предоставляются в манифесте ContainerHostPolicies приложения под тегом, как показано в следующем фрагменте кода:

  <ContainerHostPolicies CodePackageRef="NodeContainerService.Code">
    <CertificateRef Name="MyCert1" X509StoreName="My" X509FindValue="[Thumbprint1]"/>
    <CertificateRef Name="MyCert2" X509FindValue="[Thumbprint2]"/>

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

  • Certificates_ServicePackageName_CodePackageName_CertName_PFX
  • Certificates_ServicePackageName_CodePackageName_CertName_Password

Для кластеров Linux сертификаты (PEM) копируются из хранилища, указанного параметром X509StoreName, в контейнер. Соответствующие переменные среды в Linux:

  • Сертификаты_ServicePackageName_CodePackageName_CertName_PEM
  • Certificates_ServicePackageName_CodePackageName_CertName_PrivateKey

Обратите внимание, что как PEM файл, так и PrivateKey сертификат содержат сертификат и незашифрованный закрытый ключ.

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

<ContainerHostPolicies CodePackageRef="NodeContainerService.Code">
  <CertificateRef Name="MyCert1" DataPackageRef="[DataPackageName]" DataPackageVersion="[Version]" RelativePath="[Relative Path to certificate inside DataPackage]" Password="[password]" IsPasswordEncrypted="[true/false]"/>

Служба контейнеров или процесс отвечает за импорт файлов сертификатов в контейнер. Чтобы импортировать сертификат, можно использовать setupentrypoint.sh скрипты или выполнить пользовательский код в процессе контейнера. Ниже приведен пример кода в C# для импорта PFX-файла:

string certificateFilePath = Environment.GetEnvironmentVariable("Certificates_MyServicePackage_NodeContainerService.Code_MyCert1_PFX");
string passwordFilePath = Environment.GetEnvironmentVariable("Certificates_MyServicePackage_NodeContainerService.Code_MyCert1_Password");
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
string password = File.ReadAllLines(passwordFilePath, Encoding.Default)[0];
password = password.Replace("\0", string.Empty);
X509Certificate2 cert = new X509Certificate2(certificateFilePath, password, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet);
store.Open(OpenFlags.ReadWrite);
store.Add(cert);
store.Close();

Этот PFX-файл сертификата можно использовать для аутентификации приложения или службы, а также для безопасного обмена данными с другими службами. По умолчанию файлы имеют доступ только к SYSTEM. Вы можете настроить ACL для других учетных записей в соответствии с требованиями службы.

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