Compartir a través de


Uso de certificados TLS/SSL en el código de la aplicación

En el código de la aplicación, puede acceder a los certificados públicos o privados que agregue a Azure App Service. El código de la aplicación puede actuar como cliente y acceder a un servicio externo que requiera autenticación de certificados. También es posible que tenga que realizar tareas criptográficas. En este artículo se muestra cómo usar certificados públicos o privados en el código de aplicación.

Este enfoque para usar certificados en el código usa la funcionalidad seguridad de la capa de transporte (TLS) en App Service, que requiere que la aplicación esté en el nivel Básico o superior. Si la aplicación está en el nivel Gratis o Compartido, puede incluir el archivo de certificado en el repositorio de aplicaciones.

Al permitir que App Service administre los certificados tls/Secure Sockets Layer (SSL), puede mantener los certificados y el código de la aplicación por separado y proteger los datos confidenciales.

Prerrequisitos

Para seguir este artículo, consulte:

Búsqueda de la huella digital

  1. En el Portal de Azure, en el panel izquierdo, seleccione App Services><>.

  2. En el panel izquierdo de la aplicación, seleccione Certificados. A continuación, seleccione Traiga sus propios certificados (.pfx) o Certificados de clave pública (.cer).

  3. Busque el certificado que desea usar y copie la huella digital.

Captura de pantalla que muestra cómo copiar la huella digital del certificado.

Hacer que el certificado sea accesible

Para acceder a un certificado en el código de la aplicación, agregue su huella digital a la configuración de la WEBSITE_LOAD_CERTIFICATES aplicación. Ejecute el comando siguiente en Azure 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 *.

Cuando WEBSITE_LOAD_CERTIFICATES se establece en *, todos los certificados agregados anteriormente son accesibles para el código de la aplicación. Si agrega un certificado a la aplicación más adelante, reinicie la aplicación para que el nuevo certificado sea accesible para la aplicación. Para obtener más información, consulte Actualizar o renovar un certificado.

Carga de certificados en aplicaciones de Windows

La WEBSITE_LOAD_CERTIFICATES configuración de la aplicación hace que los certificados especificados sean accesibles para la aplicación hospedada en Windows en el almacén de certificados de Windows, en Usuario actual\My.

En el código de C#, se accede al certificado mediante la huella digital del certificado. 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 código Java, se obtiene acceso al certificado desde el Windows-MY almacén mediante el campo Nombre común del sujeto. Para obtener más información, consulte Certificado de clave pública. En el código siguiente se muestra cómo cargar 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 idiomas que no admiten o ofrecen compatibilidad insuficiente para el almacén de certificados de Windows, consulte Carga de un certificado desde un archivo.

Cargar un certificado desde un archivo

Si necesita cargar un archivo de certificado que cargue manualmente, es mejor cargar el certificado mediante el protocolo de transferencia de archivos seguro (FTPS) en lugar de Git, por ejemplo. Mantenga los datos confidenciales como un certificado privado fuera del control de código fuente.

ASP.NET y ASP.NET Core en Windows deben tener acceso al almacén de certificados aunque cargue un certificado 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 usar certificados en el código usa la funcionalidad TLS en App Service, lo que requiere que la aplicación esté en el nivel Básico o superior.

En el ejemplo de C# siguiente se carga un certificado público desde una ruta de acceso relativa en 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 cargar un certificado TLS/SSL desde un archivo en Node.js, PHP, Python o Java, consulte la documentación del lenguaje o la plataforma web correspondientes.

Carga de certificados en contenedores de Linux o Windows

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

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 archivo de certificado son las improntas digitales del certificado.

Nota:

App Service inserta 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_PATHy WEBSITE_ROOT_CERTS_PATH. Es mejor hacer referencia a la ruta de acceso del certificado con las variables de entorno en lugar de codificar la ruta de acceso del certificado, en caso de que las rutas de acceso del certificado cambien en el futuro.

Además, los contenedores de Windows Server Core y Windows Nano Server 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 muestra en Cargar certificados en aplicaciones de Windows. En el caso de los contenedores basados en Windows Nano, use las rutas de acceso de archivo como se muestra en Cargar un certificado desde un archivo.

El código de C# siguiente muestra cómo cargar 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

El código de C# siguiente muestra cómo cargar un certificado privado en una aplicación 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 cargar un certificado TLS/SSL desde un archivo en Node.js, PHP, Python o Java, consulte la documentación del lenguaje o la plataforma web correspondientes.

Actualizar o renovar un certificado

Al renovar un certificado y agregarlo a la aplicación, obtiene una nueva huella digital, que 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 Azure Key Vault, como con un certificado de App Service, la sincronización diaria de Key Vault realiza la actualización necesaria automáticamente cuando la aplicación se sincroniza 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 antigua a la nueva huella digital.
  • Si WEBSITE_LOAD_CERTIFICATES se establece en *, la sincronización diaria hace que el nuevo certificado sea accesible automáticamente.