Uso de un certificado TLS/SSL en el código de Azure App Service

En el código de la aplicación, puede acceder a los certificados públicos o privados que agregue a App Service. El código de la aplicación puede actuar como un cliente y acceder a un servicio externo que requiere autenticación de certificado, o puede que tenga que realizar tareas criptográficas. Esta guía muestra cómo utilizar certificados públicos o privados en el código de aplicación.

Este enfoque para el uso de certificados en el código usa la funcionalidad TLS de App Service, que requiere que la aplicación tenga el nivel Básico u otro superior. Si la aplicación está en los niveles Gratis o Compartido, puede incluir el archivo de certificado en el repositorio de la aplicación.

Cuando permite que App Service administre los certificados TLS/SSL, puede mantener por separado los certificados y el código de la aplicación y proteger así la información confidencial.

Requisitos previos

Para completar esta guía paso a paso, debe:

Busque la huella digital

En Azure Portal, en el menú de la izquierda, seleccione App Services><nombre-de-aplicación>.

En el panel de navegación izquierdo de la aplicación, seleccione Certificados y, después, seleccione Traiga sus propios certificados (.pfx) o certificados de clave pública (.cer).

Encuentre el certificado que desea utilizar y copie la huella digital.

Copy the certificate thumbprint

Que el certificado sea accesible

Para acceder a un certificado en el código de aplicación, agregue su huella digital a la opción de la aplicación WEBSITE_LOAD_CERTIFICATES; para ello, ejecute el siguiente comando en Cloud Shell:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_CERTIFICATES=<comma-separated-certificate-thumbprints>

Para que todos los certificados sean accesibles, establezca el valor en *.

Nota

Cuando WEBSITE_LOAD_CERTIFICATES se establece*, el código de la aplicación es capaz de acceder a todos los certificados agregados anteriormente. Si agrega un certificado a la aplicación más adelante, reinicie la aplicación para que el nuevo certificado sea accesible para su aplicación. Para obtener más información, consulte: Actualización (renovación) de un certificado.

Carga de certificado en aplicaciones de Windows

El valor WEBSITE_LOAD_CERTIFICATES de la aplicación permite que los certificados especificados estén accesibles para la aplicación hospedada de Windows en el almacén de certificados de Windows, en Current User\My.

En el código C#, se accede al certificado mediante su huella digital. El código siguiente carga un certificado con la huella digital 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
}

En el código Java, se accede al certificado desde el almacén "Windows-MY" mediante el campo Nombre común del firmante (consulte Public key certificate [Certificado de clave pública]). En el código siguiente se muestra cómo se carga un certificado de clave privada:

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
...

Para los lenguajes que no son compatibles o no ofrecen suficiente compatibilidad con el almacén de certificados de Windows, consulte Carga del certificado desde el archivo.

Carga del certificado desde el archivo

Si tiene que cargar un archivo de certificado manualmente, es mejor hacerlo mediante FTPS en lugar de Git, por ejemplo. Debe mantener los datos confidenciales, como un certificado privado, fuera del control del código fuente.

Nota

ASP.NET y ASP.NET Core en Windows deben acceder al almacén de certificados, incluso si el certificado se carga desde un archivo. Para cargar un archivo de certificado en una aplicación de Windows .NET, cargue el perfil de usuario actual con el siguiente comando en Cloud Shell:

az webapp config appsettings set --name <app-name> --resource-group <resource-group-name> --settings WEBSITE_LOAD_USER_PROFILE=1

Este enfoque para el uso de certificados en el código usa la funcionalidad TLS de App Service, que requiere que la aplicación tenga el nivel Básico u otro superior.

En el siguiente ejemplo de C# se carga un certificado público desde una ruta de acceso relativa de la aplicación:

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

Para ver cómo se carga un certificado TLS/SSL desde un archivo en Node.js, PHP, Python, Java o Ruby, consulte la documentación del lenguaje o la plataforma web correspondientes.

Carga de certificados en contenedores de Linux y Windows

La configuración de aplicación WEBSITE_LOAD_CERTIFICATES permite que los certificados especificados sean accesibles para los contenedores personalizados de Windows o Linux (incluidos los contenedores de Linux integrados) como archivos. Los archivos se encuentran en los siguientes directorios:

Plataforma de contenedor Certificados públicos Certificados privados
Contenedor Windows C:\appservice\certificates\public C:\appservice\certificates\private
Contenedor Linux /var/ssl/certs /var/ssl/private

Los nombres de los archivos de certificado son las huellas digitales del certificado.

Nota

App Service inyecta las rutas de acceso de certificado en contenedores de Windows como las siguientes variables de entorno: WEBSITE_PRIVATE_CERTS_PATH, WEBSITE_INTERMEDIATE_CERTS_PATH, WEBSITE_PUBLIC_CERTS_PATH y WEBSITE_ROOT_CERTS_PATH. Es mejor hacer referencia a la ruta de acceso de certificado con las variables de entorno en lugar de codificarla, por si las rutas de acceso del certificado cambian en el futuro.

Además, los contenedores de Windows Server Core cargan automáticamente los certificados en el almacén de certificados, en LocalMachine\My. Para cargar los certificados, siga el mismo patrón que se indica en Carga de certificado en aplicaciones de Windows. En el caso de los contenedores basados en Windows Nano, use estas rutas de acceso de archivo para cargar el certificado directamente desde un archivo.

En el siguiente código C# se muestra cómo se carga un certificado público en una aplicación 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

En el siguiente código de C# se muestra cómo se carga un certificado público en una aplicación de 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

Para ver cómo se carga un certificado TLS/SSL desde un archivo en Node.js, PHP, Python, Java o Ruby, consulte la documentación del lenguaje o la plataforma web correspondientes.

Actualización (renovación) de un certificado

Al renovar un certificado y agregarlo a la aplicación, este obtiene una nueva huella digital, la cual también debe ser accesible. El funcionamiento depende del tipo de certificado.

Si carga manualmente el certificado público o privado:

  • Si enumera las huellas digitales explícitamente en WEBSITE_LOAD_CERTIFICATES, agregue la nueva huella digital a la configuración de la aplicación.
  • Si WEBSITE_LOAD_CERTIFICATES se establece en *, reinicie la aplicación para que el nuevo certificado sea accesible.

Si renueva un certificado en Key Vault, como con un certificado de App Service, la sincronización diaria de Key Vault lleva a cabo la actualización necesaria automáticamente al sincronizar la aplicación con el certificado renovado.

  • Si WEBSITE_LOAD_CERTIFICATES contiene la huella digital antigua del certificado renovado, la sincronización diaria actualiza automáticamente la huella digital anterior a la huella digital nueva.
  • Si WEBSITE_LOAD_CERTIFICATES se establece en *, la sincronización se encarga de que el nuevo certificado sea accesible automáticamente.

Más recursos