Importar um ficheiro de certificado para um contentor em execução no Service Fabric

Nota

Para clusters do Service Fabric em execução no Azure, é recomendado utilizar a Identidade Gerida da Aplicação do Service Fabric para aprovisionar certificados de aplicação a partir de um contentor. A Identidade Gerida permite o isolamento de segredos e certificados ao nível do serviço e permite que o aprovisionamento de certificados de aplicação faça parte do fluxo de trabalho da aplicação, em vez do fluxo de trabalho da infraestrutura. O mecanismo CertificateRef será preterido numa versão futura.

Pode proteger os seus serviços de contentor ao especificar um certificado. O Service Fabric fornece um mecanismo para que os serviços dentro de um contentor acedam a um certificado que está instalado nos nós num cluster do Windows ou Linux (versão 5.7 ou superior). O certificado tem de ser instalado num arquivo de certificados em LocalMachine em todos os nós do cluster. A chave privada correspondente ao certificado tem de estar disponível, acessível e , no Windows, exportável. As informações do certificado são fornecidas no manifesto da aplicação sob a ContainerHostPolicies etiqueta, como mostra o seguinte fragmento:

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

Para clusters do Windows, ao iniciar a aplicação, o runtime exporta cada certificado referenciado e a respetiva chave privada correspondente para um ficheiro PFX, protegido com uma palavra-passe gerada aleatoriamente. Os ficheiros PFX e palavra-passe, respetivamente, são acessíveis dentro do contentor com as seguintes variáveis de ambiente:

  • Certificates_ServicePackageName_CodePackageName_CertName_PFX
  • Certificates_ServicePackageName_CodePackageName_CertName_Password

Para clusters do Linux, os certificados (PEM) são copiados do arquivo especificado por X509StoreName para o contentor. As variáveis de ambiente correspondentes no Linux são:

  • Certificates_ServicePackageName_CodePackageName_CertName_PEM
  • Certificates_ServicePackageName_CodePackageName_CertName_PrivateKey

Tenha em atenção que o PEM ficheiro e PrivateKey contém o certificado e a chave privada não encriptada.

Em alternativa, se já tiver os certificados no formulário necessário e quiser aceder aos mesmos dentro do contentor, pode criar um pacote de dados dentro do pacote de aplicações e especificar o seguinte no manifesto da aplicação:

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

O serviço ou processo de contentor é responsável por importar os ficheiros de certificado para o contentor. Para importar o certificado, pode utilizar setupentrypoint.sh scripts ou executar código personalizado no processo de contentor. Eis um código de exemplo em C# para importar o ficheiro 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();

Este certificado PFX pode ser utilizado para autenticar a aplicação ou o serviço ou proteger a comunicação com outros serviços. Por predefinição, os ficheiros são ACLed apenas para SYSTEM. Pode ACL para outras contas, conforme exigido pelo serviço.

Como passo seguinte, leia os seguintes artigos: