Импорт файла сертификата в контейнер под управлением 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:

  • Certificates_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. Вы можете применять список управления доступом к этим файлам для других учетных записей, если это нужно для работы службы.

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